トップページtech
1001コメント417KB

Excel VBA 質問スレ Part33

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/10/17(木) 22:04:40.64
ExcelのVBAに関する質問スレです

                   ___
       ___      /____ヽ      ____
      /____\    | |´・ω・`| |    /___ヽ
      .l |´・ω・`|  ニX二 . ̄ ̄ ̄  二X二  |´・ω・`| l 俺たちに任せろ
      !、 ̄ ̄ ̄  ヽ   |       |    /    ̄ ̄ ̄/
       ヽ_/ヽ、  ヽ__)  \__/\_/.   /_/  ノヽ_/
             ̄                ̄ ̄

前スレ
Excel VBA 質問スレ Part32
http://toro.2ch.net/test/read.cgi/tech/1381151717/

このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。

コードが嫌な人はこちらのスレへ
http://toro.2ch.net/test/read.cgi/tech/1381151995/l50
0401デフォルトの名無しさん2014/03/10(月) 01:18:59.92
普通の人は100メガの情報は一度にはみれない
ほんとにそのサイズでやり取りする必要があるのか良く考えた方がいいんじゃね
0402デフォルトの名無しさん2014/03/10(月) 06:46:54.06
>>397
ブックの共有じゃダメなの?
そもそも Excel で 100MB って言うのも色々危険な香りがするが...
0403デフォルトの名無しさん2014/03/10(月) 06:57:20.42
>>400
文字データだけならCSVで吐いて
閲覧者がブックを開いたら取り込むとかはどうよ

セル書式は予め設定しておいて、不足なら自動書式で
グラフも置いてあるなら範囲を名前定義にして取り込み時に名前定義をちょろっと修正すればいい

>>402
>LAN経由で開くと応答無しになる
に該当するんじゃないの?しないの?
0404デフォルトの名無しさん2014/03/10(月) 07:46:59.95
>>403
> に該当するんじゃないの?しないの?

共有ブックはもう少し賢いけど、正直 100MB クラスのブックを共有で使ったこと無いから試してみてくれとしか言いようがない。
共有特有のトラブルもあるし。
0405デフォルトの名無しさん2014/03/10(月) 22:22:30.84
まー、あんまり無茶な使い方しない方が無難だよね
0406デフォルトの名無しさん2014/03/10(月) 22:31:12.02
画像貼りまくりでWORDみたいな使い方をしていると想像
せめてシートごとに分割したほうがいいと思うが
変な規定でもあるんだろう
0407デフォルトの名無しさん2014/03/10(月) 22:42:00.56
100MBのファイルコピーするのに数十秒かかるLANってすごいな
それを瞬間的に閲覧するようにできるExcelVBAって万能だな
0408デフォルトの名無しさん2014/03/11(火) 10:45:11.04
>>407
100Mbpsで理論値maxでも100MBをコピーするのに10秒程度かかる。
実効値20Mbps位だったらその5倍かかるわけで、100MBのコピーに2,30秒かかる環境があってもおかしくない。
0409デフォルトの名無しさん2014/03/11(火) 20:16:20.38
>>408
細かいことだけど100Mbpsなら8秒じゃないの?
0410デフォルトの名無しさん2014/03/11(火) 21:30:20.38
>>409
実測してみるとわかるけど、固定IPで他のネット機器をすべて切り離して回線が独占できる状態を作ってやっても
オーバーヘッドがあるから最高でも表示の8割〜9割ぐらいの速度になる

実用に使ってる環境だともっと遅くなる
0411デフォルトの名無しさん2014/03/11(火) 21:44:28.36
>>409
細かい事をいうなら
ネットワーク回線を流れてるのはデータだけじゃない
実データの1バイトが8ビットの情報として流れているとは限らない
0412デフォルトの名無しさん2014/03/11(火) 21:47:49.12
でも論理値maxでって言ってるじゃん
0413デフォルトの名無しさん2014/03/11(火) 22:23:55.06
理論値なんて一番速い時の値だから、無線 LAN なんて理論的にも絶対その値は出ないしな。
0414デフォルトの名無しさん2014/03/11(火) 22:41:58.20
理論値にはいろんな取り方があるからな
ファイル転送の理論値マックスは回線上の理論値マックスからいろんな層のオーバーヘッド分下がるのが当然
0415デフォルトの名無しさん2014/03/15(土) 18:19:11.62ID:wdy6oLTC
VBA初心者ですが
VBAの命令だけを書いた空のブックと、
分析したいデータが書かれたブックを分離して運用することは可能なのでしょうか?

現状データの書かれたブックが数十に同一処理をさすためにそれぞれにVBAを記述していますが
処理方法を変更する場合全ブックの同じVBAコードを書き換えていて手間がかかっています。
ならば空のVBAだけを書いたブックを1つ動かしておけば済むのではと思ったのですが
ここにいらっしゃるプロの方はどうされているのでしょうか?
04164152014/03/15(土) 18:22:17.82ID:wdy6oLTC
>>415
又、空のブックで運用ができるのであればよく使う命令を個別にモジュール化して連携やネストさせるような運用方法も可能なのでしょうか?
これができるとなるとデータの書かれているシートにVBAを書くのは大量のブックを処理する場合は非合理的かと思いましたがどうでしょうか?
0417デフォルトの名無しさん2014/03/15(土) 18:34:24.97ID:IpiW3W82
>>415
> 分離して運用することは可能なのでしょうか?

可能

Excel アドイン 作成 とかでググると幸せになれるかも
04184152014/03/15(土) 18:47:05.31ID:46w16LKJ
>>417
アドイン、、こんな便利な物があったのですね。ありがとうございます。
大幅な合理化が図れそうです
0419デフォルトの名無しさん2014/03/17(月) 04:12:41.18ID:NI0yZz+J
以前こちらでマクロを作っていただき、とても重宝して使わせていただいていたのですが
少し仕様の変更が出てきてしまったため、再度作成か手直しをしていただきたいのですが
お願いできますでしょうか。

以下のマクロで月初から月末の所を、月初から翌月の3日までにしたいのです。
どうか宜しくお願い致します。
0420デフォルトの名無しさん2014/03/17(月) 04:15:10.22ID:NI0yZz+J
Sub SheetCopy()

Dim firstDay As Date
Dim lastDay As Date
Dim targetDay As Date
On Error GoTo Error_Handler

With ThisWorkbook

'月初日を取得
firstDay = .Sheets("1日").Range("B1").Value
'月末日を取得
lastDay = DateSerial(Year(firstDay), Month(firstDay) + 1, 0)
0421デフォルトの名無しさん2014/03/17(月) 04:18:35.64ID:NI0yZz+J
'月初日のシートは既に存在しているので、
'先にシート名とシート色を設定してしまう。
'.Sheets(Sheet1.Name).Name = Format(.Sheets(Sheet1.Name).Range("B1").Value, "m月d日")
If Not .Sheets("祝日").Cells.Find(firstDay, LookAt:=xlWhole) Is Nothing Or _
Weekday(firstDay) = vbSunday Then
.Sheets("1日").Tab.ColorIndex = 3
End If
0422デフォルトの名無しさん2014/03/17(月) 13:25:21.94ID:vj1XNX0y
>>419-421
これコードの一部分だけだよね?
月末日を保持しているであろう変数"lastDay"をどこで使うのか分からないけど、
(ここに貼られている範囲では月末日を取得してるだけでそれを使用していない)

lastDay = DateSerial(Year(firstDay), Month(firstDay) + 1, 0)



lastDay = DateSerial(Year(firstDay), Month(firstDay) + 1, 3)

に変更するだけで翌月3日までにはなる。
ただし、それをどのように利用するのかはこのコード以外の部分に書いてあるので
単純にこれだけでそのコード全体が正常に(あなたの意図した通りに)動くかどうかは分からない。
0423デフォルトの名無しさん2014/03/17(月) 22:24:00.94ID:iQzGYjkh
>>422
やる気のないやつに解釈垂れても意味ないぞ。
そんな解釈より動くコードしか興味ないからコード書けって言ってるんだから。
0424デフォルトの名無しさん2014/03/17(月) 23:26:36.86ID:vj1XNX0y
>>423
いや、別にどんな相手でも良いっすよ
こっちが好き勝手に書いてるだけだし。

ところで、垂れるのは解釈じゃなくて講釈ですね。
0425デフォルトの名無しさん2014/03/18(火) 00:01:33.11ID:YCsGrVX8
すみません419です。
昨日はなぜかエラーが出たあと、バイさるになったまま書き込みができなくなり
続きのコードを貼る事が出来ませんでした。

このあとの続きのコードは、シート名の指定と日祝の色指定のコードになっているのですが
シート名を1日、2日、3日、となるように指定しているため、これだと翌月の3日分が重複してしまうためか
422さんの仰るMonth(firstDay) + 1, 3では、エラーになってしまい上手くいきませんでした。

要は、月初から翌月の3日までのシートを作りたく、その際、日祝を赤字にし
尚且つ各シートのB1セルに○月○日と表示したものを作りたいのですが
何か上手くいく方法はありますでしょうか。
よろしくお願い致します。
04264222014/03/18(火) 00:51:31.95ID:Riw4xitA
>>425
シート名に月も入れるとか翌月の3日分のシート名に翌月って付け加えるとか、
やりようはそれなりに有るんでないかい?

その程度の修正は元のコードさえ曝せば
このスレの人達なら簡単に出来るだろうけど、
肝心のコードが無けりゃ誰にもどうにもなんないよね。

ちなみに俺は寝るんで今日はもう出来ないです。
0427デフォルトの名無しさん2014/03/18(火) 01:11:58.51ID:YCsGrVX8
>>426
早速のレスありがとうございます!
修正でも新規に作成でも、作っていただけるのなら
どちらでも大変嬉しいのですが、一応続きのコードを晒しておきますので
お時間のある時に、どうか宜しくお願い致します!

因みにシート名は、1日、2日、3日、、、としたいため
翌月3日分は「翌月」と付け加える方向でお願いしたいと思います。
0428デフォルトの名無しさん2014/03/18(火) 01:13:33.38ID:YCsGrVX8
'ひと月分のシートをコピーし、
'シート名、シート色の設定を行う。
For targetDay = lastDay To firstDay + 1 Step -1
.Sheets("1日").Copy After:=Sheets("1日")
.ActiveSheet.Tab.ColorIndex = xlNone
.ActiveSheet.Range("B1").Value = targetDay
.ActiveSheet.Name = Format(ActiveSheet.Range("B1").Value, "d日")
If Not .Sheets("祝日").Cells.Find(targetDay, LookAt:=xlWhole) Is Nothing Or _
Weekday(targetDay) = vbSunday Then
.ActiveSheet.Tab.ColorIndex = 3
End If
Next

End With

Exit Sub

Error_Handler:

'例外時はエラー内容を表示する。
MsgBox Error

End Sub
04294222014/03/18(火) 08:56:33.08ID:Riw4xitA
>>428
こんな事言っちゃなんだけど、>>419-421の時点で薄々感じてたとおり
やっぱり糞コードだったw(気を悪くしたらゴメンネ)

いろいろ突っ込みどころ満載なんだけど、とりあえずこのままやるんだったら
例えば>>428

.ActiveSheet.Name = Format(ActiveSheet.Range("B1").Value, "d日")



If Month(targetDay) = Month(firstDay) Then
.ActiveSheet.Name = Format(ActiveSheet.Range("B1").Value, "d日")
Else
.ActiveSheet.Name = "翌月" & Format(ActiveSheet.Range("B1").Value, "d日")
End If

に変更するととりあえず動くよ。

根本的にコード全体を書き直したほうが尚更良いとは思うけど、
そういうのは俺みたいなアマチュアじゃなくて
お金を払って誰かきちんとしたプロに頼むような話になるんじゃないかな。
0430デフォルトの名無しさん2014/03/24(月) 00:24:00.84ID:mInA5lgN
実行中のマクロを停止させたいときにはESCか、Ctrl+PauseもしくはCtrl+Breakとのことですが、
両者に違いはあるのでしょうか?また、どれを試しても停止しない場合の対応策ってあるんですか?
0431デフォルトの名無しさん2014/03/24(月) 12:27:01.03ID:KuNBiX6y
>>430
ぐぐったらこんなん出てきた

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1149563081

まぁ、なんで動作が違うのかは読んでも分からんかったけど。

あと、ESCとかで停まんないときは
おいらはしょうがないからタスクマネージャからエクセルごと停止させてる
0432デフォルトの名無しさん2014/03/29(土) 16:33:15.72ID:e3FYqT1N
1万行×5列 の生データを元に、1万行×100列の中間データをひとまず作成し、
その後、中間データを諸々の処理に使う。
今は、VBAで中間データを計算させている。中間データはワークシート関数で計算させることもできる。
今のように中間データはVBAで計算させるのがいいのか、
それとも中間データはワークシート上で計算させVBAで計算結果を読み込んでその後の処理を行うのがよいのか?
0433デフォルトの名無しさん2014/03/29(土) 19:49:34.25ID:OpDSuCZS
善し悪しの判断基準が曖昧だよ。

ブックの動作の軽さを求めるならVBAで処理して
セルには値だけを入れるほうが良いけど、
セルに数式を入れてあればどういう処理をしているのか目で見て確認できる。

これはVBAが分からない人を相手にする時には結構重要なことで
俺も勤務先で自分で使うブックはVBA使いまくりだけど
マクロ知らない上司に提出するものは出来る限りマクロを使わずに処理してる。

というか「マクロ使ったものは何をやってるか分からないから信用できない」
といわれて提出できない。
04344322014/03/29(土) 21:33:41.21ID:e3FYqT1N
>>433
このブックは私だけが使うものです。重視したいのはマクロが高速であるかどうかということ。
VBAの高速化に関するウェブページを読むと、
コーディングの方法によりマクロ終了までの時間が大きく変わり、
又、worksheetFunctionは比較的高速であるとの情報もありました。
そこで、下手にVBAで全部処理させるよりもワークシート関数で計算できるところはワークシートで処理させるほうが
今より早くなるのかなと思ったわけです(VBAは独学のためあまり自信がないのです)。
ちなみに、生データは1日に1行ずつ増えます。処理は毎日実行します(会社休日は実行しない)。
04354332014/03/29(土) 23:51:13.09ID:OpDSuCZS
>>434
あぁ、どっちみちVBA自体は使う前提で、
VBAのコード中でワークシート関数を使うかべきかどうかって話だったのね
そんなの好きにしたら良いじゃん
ワークシート関数使った場合と使わない場合を両方試して
速いほう使ったらいいんじゃないの
0436デフォルトの名無しさん2014/03/30(日) 00:25:58.15ID:v4CA15kT
大量のデータをブックに貯めこむんじゃなくデータベースに入れてエクセルは
必要なデータだけ持ってきて計算にのみ使ったほうが良いんじゃないかい

ま、1万行くらいなら大丈夫ではあるんだろうけど
0437デフォルトの名無しさん2014/03/30(日) 00:31:57.51ID:4kZGo4f6
VBA使う前提ではないんじゃない
VBA使うか、ワークシート関数でゴリゴリやるか、どっちかが早いかって話なんじゃ?
全部再計算させて、中間結果必要ないなら、多分VBAでやった方が早くできると思うけど
それなりにVBAがちゃんと使えるなら、って前提だが
まあ今時のスペックなら1万×5ぐらいならワークシートでも気にするほどではないと思うが
04384322014/03/30(日) 01:17:55.49ID:hXPzlqPD
>>435-437
レスありがとうございます。どちらにしてもVBAは使います。
今VBAで行っている計算の一部をワークシート関数で置き換えるべきかを検討中なのです。
VBA高速化関連のページは一通り目を通して以前に比べれば格段に早くなったのですが、
それでも数時間かかる処理もあって更なる高速化を目指しているところなのです。
一概には言えないようなので時間を測定してみます。
データの持ち方についてもいい方法を模索しています。ありがとうございました。
0439デフォルトの名無しさん2014/03/31(月) 00:10:35.50ID:ymkB1Ks5
すみません、質問です

Formula1:="=IF(A2="""",A2,INDIRECT(A2))"

A2の部分をを cells(1,2)という形で指定できないでしょうか?

やりたいことはプログラムのループでA2を
B2,B3と変えたりしたいのです、アドバイスお願いします
0440デフォルトの名無しさん2014/03/31(月) 00:57:57.69ID:+/Q0rb5y
>>439
B2、B3・・・としたいなら

For b = 2 to 9
  (略) Formula1:="=IF(A2="""",A2,B" & b & ")"
Next

みたいにすればB2〜B9になる

本筋とは関係ないけどIFでA2が""の時A2を返すのってなんか無駄っぽい
0441デフォルトの名無しさん2014/03/31(月) 01:05:38.55ID:ymkB1Ks5
>>440さん

アドバイス頂き有難うございます。

もうひとつ質問させて頂きたいのですが、

Bという位置が不定の位置なので変数で値を決めたいのですが可能でしょうか?

お手数をおかけして申し訳ございません。
0442デフォルトの名無しさん2014/03/31(月) 01:15:24.40ID:+/Q0rb5y
>>441
文字列型の変数に入れて
Retsu = "B"

こうする
(略) Formula1:="=IF(A2="""",A2," Retsu & b & ")"

B列以外だとbって変数名は不適切かな
0443デフォルトの名無しさん2014/03/31(月) 01:22:00.80ID:ymkB1Ks5
>>442さん

何度もアドバイス頂き有難うございます。

夜遅いのにご返事有難うございました。

今、エクセルを試す環境がないので明日試してみます。

また、質問があったら相談させて頂きます。
0444デフォルトの名無しさん2014/03/31(月) 01:55:50.99ID:nFhjZp0H
>>438
処理に数時間もかかるの?
それなら、変わらない部分をメモ化すれば?

1日に1行ずつ増えるんでしょ?
前日までの行が変わらないなら、
その結果をファイルに書いておけばよい

出来れば、毎回する同じ計算を避ける(メモ化)
0445デフォルトの名無しさん2014/03/31(月) 15:01:50.77ID:Ial2Eqsw
>>444
いや、そういうことするより、まず何にどれだけ時間がかかってるか計測するのが先。
0446デフォルトの名無しさん2014/03/31(月) 16:48:16.50ID:3GCmwtHU
エクセルで256×256のセルに数字が入っている状態で
BMPの画像を作るにはどうしたらいいでしょうか?プログラミングの技術が
ないと不可能でしょうか?
0447デフォルトの名無しさん2014/03/31(月) 17:05:56.79ID:r3mdI7xZ
C言語でBMP作るのは、そういうのがあるってことは知ってる。それと同じことをvbaでやりたいってことなら
(それがvbaで出来るかどうかは知らんけど)当然
>プログラミングの技術がないと不可能
じゃないの?
0448デフォルトの名無しさん2014/03/31(月) 18:23:52.03ID:L50LbWDs
そうですよね・・・
自分には敷居が高そうなので諦めます。すみません
0449デフォルトの名無しさん2014/03/31(月) 18:28:43.68ID:8V+7Or/W
はい敷居きた
0450デフォルトの名無しさん2014/03/31(月) 18:31:32.29ID:Ial2Eqsw
>>448
「セルに数字」じゃなくて実際に色を付けて、セルの幅と高さを1:1に保って小さくして、枠線を消して
クリップボードにコピーして、BMPで書き出せば?
0451デフォルトの名無しさん2014/03/31(月) 20:37:19.25ID:S+MvAbw+
図としてコピー
あれVBAからつかえんの?
0452デフォルトの名無しさん2014/04/01(火) 01:26:03.72ID:5tQShRLT
三項演算子とか連想配列を最近知ったものですが
上記のような便利機能が他にも紹介されてるサイトってないですか
0453デフォルトの名無しさん2014/04/02(水) 00:30:48.39ID:+8s/Qgvh
If Not IsNumeric(data) Then

ElseIf (data > 0) Then

ElseIf (data < 0) Then

Else

End If

数値か文字として渡されるdataの判定を上記のようにしたんですけど、
冗長なのでSelect Caseにしたいです。どうしたら良いですか?
0454デフォルトの名無しさん2014/04/02(水) 00:53:09.51ID:9+cif8YO
>>453
Sgn
0455デフォルトの名無しさん2014/04/02(水) 01:25:50.89ID:+8s/Qgvh
>>454
おお、ありがとうございました!
0456デフォルトの名無しさん2014/04/05(土) 19:04:50.32ID:zCQPlUhY
ちょっとズレるけど
ここのセミナーってどうなの?
ステマとかじゃなく純粋に気になった
ttp://sugoikaizen.com/
0457デフォルトの名無しさん2014/04/05(土) 19:07:13.30ID:Crk62Mwa
>>456
すごくおすすめだよ
行っておいでw
0458デフォルトの名無しさん2014/04/05(土) 20:05:46.77ID:eYN2DOjD
VBAをVBE以外で書きたいんですけれども、誰かVBE以外のエディターで開発されてる方いますか?
いる方は、何をお使いになってますか?

VBEで以下の不満があり、関数のアウトライン機能がないこと、列挙体変数をTabで選択せずそのまま入力するとその入力された変数名に変更されてしまうなどがあり、困ってます
0459デフォルトの名無しさん2014/04/20(日) 20:06:57.56ID:FLwMWrjy
dir を使って、配列にいれたファイルをチェックするマクロを作りたいのですが、
「インデックスが有効範囲にありません」というエラーがでてしまって困っています。

Sub チェック()

Const Target As String = "C:\Users\user\Desktop\格納\"

Dim tmp() As String
tmp = Split("Scr14", "Scr16")

For i = 1 To 2
If Dir(Target & tmp(i) & ".txt") <> "" Then '←エラーの出る場所(tmp部分)
Else
MsgBox tmp(i) & vbCrLf & "が存在しません"

End If

Next
MsgBox "確認できました"

End Sub


Dirに配列を使ってチェックするのは無理なのでしょうか?ご教授願います。
0460デフォルトの名無しさん2014/04/20(日) 20:12:33.50ID:I6Nwishv
>>459
配列のアクセスに関するエラーだからDirは関係ないかな
Split("Scr14", "Scr16")は、Split("Scr14,Scr16", ",")の間違いだとして、
tmpは
tmp(0) = "Scr14"
tmp(1) = "Scr16"
こうなってる

なんで、ループは0 To 1にしなきゃいけない
0461デフォルトの名無しさん2014/04/20(日) 20:26:26.65ID:FLwMWrjy
>>460
回答ありがとうございます。

配列に関しても理解が足りてなかったようです。

単純に文字の配列を作りたいだけなので、

Dim tmp() As String = {"Scr14", "Scr16"}

のようにしたいのですが、 = のところで、コンパイルエラーが出てしまいます。(修正候補:ステートメントの最後)

どのように修正したら良いでしょうか。
0462デフォルトの名無しさん2014/04/20(日) 20:36:06.91ID:kzevG+UG
>>461
VBAではVBみたいな書き方はできない

Dim tmp
tmp = Array("Scr14", "Scr16")
0463デフォルトの名無しさん2014/04/20(日) 20:36:17.19ID:I6Nwishv
>>461
VBAでは変数は宣言時に初期化できないので、これで

Dim tmp(1) As String
tmp(0) = "Scr14"
tmp(1) = "Scr16"

Variantでよければ
Dim tmp
tmp = Array("Scr14", "Scr16")
0464alchemist ◆IOGp1zS1sA 2014/04/20(日) 20:41:04.41ID:FLwMWrjy
>>462
>>463

ありがとうございました。成功しました。
0465デフォルトの名無しさん2014/04/23(水) 11:33:23.29ID:/2+x+Vgo
Excel VBAでpowershellを実行し、その結果を取り込みたいと考えています。
powershellで実行したいのは以下のコードです。

$drive = Get-WmiObject -Class Win32_LogicalDisk | where-object {$_.deviceid -eq 'Y:'};$drive.providername

txtファイルに出力してから取り込めばうまくいくことは分かるのですが、できればtxtファイルを経由せず、直接取り込みたいです。
直接取り込む方法があれば、ご教示いただけないでしょうか。
0466デフォルトの名無しさん2014/04/23(水) 11:50:34.55ID:HGvdUff0
http://tech.guitarrapc.com/entry/2013/07/19/200702
のサイトで見ただけなんでそれが出来るのかどうかは知らないけど

結果をクリップボードに送り込めるなら、後はそのデータをapiを使うなりDataObjectオブジェクトを使うなりで
クリップボードから取り出せる
0467デフォルトの名無しさん2014/04/23(水) 12:31:02.08ID:ZM+hJQpr
>>465
ほい
PowerShellの出力をワートシートのA列に取り込むサンプル

' OpenProcess
Declare PtrSafe Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Const SYNCHRONIZE = &H100000
' WaitForSingleObject
Declare PtrSafe Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Const WAIT_OBJECT_0 = &H0
' CloseHandle
Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Sub sample2()
  Dim hProcess As Long, lret As Long
    
  lret = Shell("powershell ""Get-WmiObject -Class Win32_LogicalDisk|Clip""", vbHide)
  hProcess = OpenProcess(SYNCHRONIZE, 0, lret)
  Do Until WaitForSingleObject(hProcess, 100) = WAIT_OBJECT_0
    DoEvents
  Loop
  lret = CloseHandle(hProcess)
    
  Cells(1, 1).Select
  ActiveSheet.Paste
End Sub
04684652014/04/23(水) 15:48:54.72ID:05nonx0d
>>466
>>467
返信ありがとうございます。

>>467
試したのですが、ネットワークドライブのリモート名に日本語が含まれている場合は?に化けてしまい、うまく回らない状況です。
(含まれていない場合はうまくいったのですが)
0469デフォルトの名無しさん2014/04/23(水) 18:28:55.92ID:ZM+hJQpr
>>468
Shell("powershell ""$OutputEncoding = [console]::OutputEncoding;ほげほげ
04704652014/04/25(金) 00:24:01.06ID:dAeKMCVg
>>469
返信ありがとうございます。


>>467
Declareのところだけ既に同名の宣言をしてあったのでそれを活かす形式にし(何故かPtrSafeがうまくいかなかった)、
$OutputEncoding =〜も使わせていただいたところ、
今のところ問題なく回っています。

皆さんご協力ありがとうございました。
助かりました。
0471デフォルトの名無しさん2014/04/25(金) 00:48:38.11ID:97MfQF5y
>>470
PtrSafeは64bit環境
0472デフォルトの名無しさん2014/04/25(金) 19:43:27.59ID:IKtZUAxC
お願いします
シート名「uriae」の
F2に入っている関数をF列の下へ向かってオートフィル
で関数をコピーしていくVBAをお願いします。
関数のコピーは、同じシートのA列に文字が入力されているので
A列の文字が入力されている最終行までコピーしたいと思います。
0473デフォルトの名無しさん2014/04/26(土) 01:31:25.36ID:w0bO41GV
>>472
ここは質問スレであって作ってくれる場所じゃないから
まずは自分でどうやろうとしたかを書いてみればいいと思うんだ
0474デフォルトの名無しさん2014/04/28(月) 01:08:06.58ID:Z51g+zsH
うりあえ?
0475デフォルトの名無しさん2014/05/05(月) 00:35:51.93ID:UkI77+Fd
すみません、初めてVBAを作っているのですが詰まってしまいました。

<やりたいこと>
・セルに商品NOを入力して、そのセルがロストフォーカスしたタイミングで、
入力された商品NOで別シートの商品表から、商品名をもってきたい。
<困っていること>
"Worksheet_Change"イベントを使用して、ロストフォーカスのイベントを
拾うことはできたが、ロストフォーカス前に選択されていたセルの内容を
拾えない。
(ActiveCell.Valueで取得しようとしたが、ロストフォーカス後に選択された
セルの内容を取得してしまう。)

もしよい方法があれば、ご教授いただけませんでしょうか。
0476デフォルトの名無しさん2014/05/05(月) 01:55:30.65ID:uFaF33P2
>>475
SelectionChangeイベントで、カーソルが動くたびにセルの座標をいちいち独自の履歴に溜めていく

だけど普通は商品NOが確定すると同時にChangeイベントで商品名をセットするもんだよ
ワンテンポ遅らせる理由がわからない
初心者ならなおさらセオリー通りにやった方がいい
さらに言えば、商品名をセットする程度の処理ならVBAを使うまでもなくVLOOKUPとかで可能だし
0477デフォルトの名無しさん2014/05/05(月) 04:35:04.82ID:UkI77+Fd
>>476
vlookupなんていう関数あったんですね・・・
これで解決できそうです!
ありがとうございました!
0478デフォルトの名無しさん2014/05/05(月) 18:42:40.78ID:AK1zskjW
Excel2013です。複数のページからクエリでデータを取得したいです。

Sheet1のA列から下へ取得したい先のURLが入力されていて、クエリでデータを取得し、新しいシートA1に貼り付けする。
Sheet1のA列のセルが空白になれば処理を終了する。

VBAでクエリを実行する事が出来る所までは出来たのですが、上記の様にしたいのですが知識が乏しく躓いています。

今、出来ているのは下記になります。

Sub クエリ抽出 ()

With ActiveSheet.QueryTables.Add(Connection:= _
"url;取得データがあるURL", _
Destination:=Range("A1"))
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "1"
.Refresh BackgroundQuery:=False

End With

End Sub

宜しくお願いします。
0479デフォルトの名無しさん2014/05/11(日) 20:01:24.57ID:0QNYDm24
申し訳ない、このスレの趣旨とはズレてると思うんだけど、総合スレ的なものがどこにあるか分からないから聞かせてほしい。
参照元のないセルにデータ(数式ではない)を入力したときに循環参照のエラーが出てしまうんだけど、EXCEL 2010にはそういうバグがありますか?
参照先のセルを見てもさっぱり原因がわからなくて困ってます。
周辺のセルはオートフィルで埋めてるので数式は大差ないのに、ある一つのセルだけどうしてもエラーになってしまいます。
0480デフォルトの名無しさん2014/05/11(日) 20:34:18.27ID:9n+Ded1d
総合スレならビジネスsoftの方に

Excel総合相談所 113
http://toro.2ch.net/test/read.cgi/bsoft/1398901813/l50

ってのがあるけど
0481デフォルトの名無しさん2014/05/11(日) 20:39:46.70ID:0QNYDm24
>>480
ありがとうございます。そちらで質問させていただきます。
0482デフォルトの名無しさん2014/05/11(日) 21:08:18.06ID:valH51XC
WordVBAスレがないんでここで質問させてください

フォルダに画像がたくさんあります。
これをWord文書の1ページに1枚貼り付けたいです。
貼り付け方は左上に合わすだけでいいのでたぶんそんなに設定はしなくていいんじゃないかな。
貼り付け方も行内でも四角でもどちらでも変わらないと思うし。
でも今後の発展のため仮に画面の中央のどまんなかにあわせ、挿入方法は「四角」だとどうなるでしょう?
幅・高さは、どちらかが外周に接するところまでひきのばし/縮めるとします。縦横比はオリジナルと同じにして。

ExcelVBAからでもCreateObject("Word.Application")みたい感じでWordを操ることができると思うのでお願いいたします。
0483デフォルトの名無しさん2014/05/11(日) 21:09:51.81ID:valH51XC
まあ画像のフルパス("C:\Users\USER\Desktop\pic01.jpg")みたいなのを
Excelのセルにあらかじめ書き込んでるとしましょう。
0484デフォルトの名無しさん2014/05/12(月) 01:23:50.26ID:DXQGbXMr
質問です。
VBAの講習を受講して思ったが、簡単な実務に生かすために、短時間で習得するための方法。
これあってますか?
★マクロを組んで、マクロで処理できない条件処理の構文を追加することを覚えることが、
一番楽で簡単なエクセル処理には向いてますか?
それとも、すべて手打ちすることを覚えるほうが、かなり有用ですか?


状況
簡単なマクロ等の自動処理がしたい。
スキルは、VBAの勉強は講習で30時間ほど。まったく身につかなかった。
関数等は普通に使える。
0485デフォルトの名無しさん2014/05/12(月) 11:17:08.22ID:tYXPKjS8
今の自分が必要とするもの…で無い限りモチベーションに苦労しないか?
実務に活かす事が目的なら今の仕事を自動化するにはどうればいいかを考えれば良いと思う

>すべて手打ちすることを覚えるほうが
ってのが何を言ってるのかわかんないけど。
0486デフォルトの名無しさん2014/05/12(月) 13:02:48.27ID:OiSoC7y/
マクロの記録と手書きで違うものだと思ってるのかな
0487デフォルトの名無しさん2014/05/12(月) 22:03:47.06ID:1mlAXgHL
マクロ自動記録で出来る事できない事は把握してるようだけど。。。
要は「簡単なマクロ等の〜」簡単がどこまでかでしょう。
最初はきちんと教えてもらった方がいい。
観念的だが、ゼロ→1は難しく1→2は比較来容易
0488デフォルトの名無しさん2014/05/13(火) 02:43:20.87ID:/l0lTNTz
俺にはこの人の文章が理解できないが
30時間も講習うけてまったく身につかなかった人だぞ
うける講習まちがってるか、絶望的に向いてない人かどっちかだ
0489デフォルトの名無しさん2014/05/13(火) 11:32:08.29ID:VmzA9yq/
>>484の★部分の意訳

マクロの自動記録をして
自動記録では処理が出来ない条件分岐等をVBAで追加するという方法が、
エクセルでの処理の自動化には有効ですか?

それとも、自動記録に頼らず、
全てVBAで記述することを覚えたほうが良いでしょうか?

ということだと思う。

俺なりの回答としては、自動記録を使おうが使うまいが
VBAの基本的な知識はどっちみち必要だし是非覚えるべき。

VBAで出来て自動記録で出来ないことはたくさん有るけど
自動記録で出来てVBAで出来ないことはない。

もちろん、自動記録で出来ることならVBA使わずにやったって構わないし、
自動記録で記録したほうがコード手書きするより早い場合もある。

でも、VBAを知ってないと
やりたい作業を自動記録でやるのとVBAでやるのと
どっちが楽かとか判断できない。
0490デフォルトの名無しさん2014/05/13(火) 12:55:48.39ID:V6Rb20LO
再利用性とか考えると、シートからのデータ抽出、主処理、処理結果の反映って作りになる
だからマクロの記憶はベースとなるものではなく、Excelオブジェクトの操作方法を調べる時ぐらいしか使わない
0491デフォルトの名無しさん2014/05/13(火) 16:35:43.02ID:JkOdWH0g
Sub A()
Range("D11").Select
Selection.End(xlDown).Columns("H").Select
ActiveCell.FormulaR1C1 = "1"
End Sub

(H列,Dの最終行)に1を入れたいんですが(K列,Dの最終行)になってしまいます。
どうすればいいんでしょうか。
0492デフォルトの名無しさん2014/05/13(火) 16:49:49.69ID:VmzA9yq/
Selection.End(xlDown).Columns("H").Select

ってところが問題
これだとSelectionが"D11"で、.End(xlDown)がそこからの最終行(つまりD列の最終行)となるんだけど、
次の.Columns("H").Selectはそこを1列目(A列)として右に8列目(H列)
(つまりD列の7列右でK列)を選択している。
解決方法はまぁとりあえず.Columns("E").Select とか .Columns(5).Selectにしたり、
列の指定と行の指定を別々にやったり色々ある
0493デフォルトの名無しさん2014/05/13(火) 18:00:38.46ID:JkOdWH0g
Hの文字を内部に使いたいんですがその場合はどういう方法がいいでしょうか
0494デフォルトの名無しさん2014/05/13(火) 18:51:25.04ID:r+9o8GUq
あるセル範囲 (行も列も複数ある) の値を配列変数に入れるには、どういう方法が一般的ですか?
行と列の二次元だけれど、配列は1次元とします。(順番はどうでもいい。セル範囲のセル数が要素数となる。)
0495デフォルトの名無しさん2014/05/13(火) 18:52:46.12ID:r+9o8GUq
ついでに空白セルがあった場合はそのセルは無視します。
0496デフォルトの名無しさん2014/05/13(火) 19:01:16.72ID:VmzA9yq/
>>493
列と行を別々に指定する。

つまり、列はH列で決まってるわけだから
Cells(Selection.End(xlDown).Row, "H").Select
とかでいいじゃん。

Selection.End(xlDown).Row
で、Selection(つまり"D11")から下に探した行を取得して、それを指定
列はそのまま"H"でH列を指定
ということ
0497デフォルトの名無しさん2014/05/13(火) 19:08:16.70ID:JkOdWH0g
>>496
ありがとうございます
04984872014/05/13(火) 21:08:23.50ID:wn45zDPA
>>488
すまん、30分と間違えた
0499デフォルトの名無しさん2014/05/13(火) 21:32:17.40ID:ph3+WM+5
30分www
まぁ手書きで
0500デフォルトの名無しさん2014/05/14(水) 15:02:32.44ID:CuHF+7gT
何方か>>478をお願いします。
検索してみたら、同じ様な事をしたい人が居たのですが、解決には至っていませんでした。
どうか、宜しくお願いします。
■ このスレッドは過去ログ倉庫に格納されています