Excel VBA 質問スレ Part32

このエントリーをはてなブックマークに追加
908デフォルトの名無しさん:2014/05/11(日) 17:14:44.13 ID:9n+Ded1d
Err.Numberのこと?

俺は
MsgBox Err.Number & " " & Err.Description, vbCritical, "xxxx"
とかで表示させて強制終了にしてるけど


実行時エラーの一覧
http://officetanaka.net/Excel/vba/error/execution_error/index.htm
909デフォルトの名無しさん:2014/05/11(日) 17:37:21.71 ID:sdx099L9
>>903
エクセルそのものはマルチコア対応だから、普通のワークシート関数とかは効果あるはず

そもそもCPUが原因で遅いのじゃなければ、CPU早くしても効果薄いぞ
100メガのエクセルとか、IOでだいぶ時間食う気がするけど
ハードに金かけるならSSDとか試してみる価値はある

VBAのコード見直せば早くなる可能性もあるけど
910デフォルトの名無しさん:2014/05/11(日) 17:39:07.78 ID:valH51XC
>>908
ありがとうございます。
Errオブジェクトというのがあったのですか。
これは便利ですね。
911デフォルトの名無しさん:2014/05/11(日) 20:47:26.63 ID:zdamCAAu
>>903
何をやってるのかわからんけど、画像とかなしで 100MB になってるなら、マジで DBMS の導入考えた方がいいかも
SQL-Server Express とかならとりあえず只だし
912デフォルトの名無しさん:2014/05/12(月) 15:19:33.35 ID:l6E7y7n0
>>893
仕事で年に1回しか使わないマクロで、参照を設定し忘れて毎度何でエラーになるのか悩むもんでw
913デフォルトの名無しさん:2014/05/12(月) 15:46:22.10 ID:r3XyQ/Bd
>>912
ソースの先頭か、最初に開くシートの見える場所にコメントを書いておく
俺がよく使う方法は、ファイル名にコメントを入れる

Book1 (参照設定を忘れないこと).xlsx

ファイル名を勝手に変更できない時は、同じフォルダに空のテキストファイルを作って、
そのファイル名をコメントにしておく

Book1.xlsx
Book1 (参照設定を忘れないこと).txt

こんなふうにしておくと、2つのファイルが隣に並ぶので、コメントが必ず目に入る
914デフォルトの名無しさん:2014/05/12(月) 16:22:06.75 ID:Pq2vKY3y
>>912
参照先のパスが毎回変わるとか、特殊な事情があるのか?

なぜ参照設定した状態で保存しないの?
なぜ実行時にコードで動的にやる必要があるの?
915デフォルトの名無しさん:2014/05/12(月) 18:04:32.83 ID:tYXPKjS8
Excel2010

フォームにあるボタンを一時的に機能を停止するのに
btnxx.Enabled = False
にすれば、ボタンがグレーアウトされて使えなくはなりますが、シートに貼り付けたボタン
に対して同じような事するにはどうするんでしょうか?
916デフォルトの名無しさん:2014/05/12(月) 21:17:50.64 ID:Pq2vKY3y
>>915
Sheet1.Shapes("ボタン 1").ControlFormat.Enabled = False
Sheet1.CommandButton1.Enabled = False
とか
ただ、フォームコントロールのEnabled=Falseにしても、グレーアウトしないな
押せなくはなるけど
917デフォルトの名無しさん:2014/05/12(月) 21:53:45.43 ID:tYXPKjS8
>>916
こちらの言い方がおかしかったか
http://www.dotup.org/uploda/www.dotup.org5057295.jpg
こういう状態の事です。

ま、それは良いんですが、、、
すいません、上の方でだと、動いてしまいます
下だと
オブジェクトは、このプロパティまたはメソッドをサポートしていません。
で実行時エラー438になってしまいます。

当面動作予定は無いので、消しておきます
918デフォルトの名無しさん:2014/05/13(火) 03:16:42.81 ID:fpyFYdoX
>>917
シートに貼るボタンは「フォーム コントロール」と「ActiveX コントロール」の2種類ある
で、グレーにして押せなくできるのは後者で、>>916の2番目も後者に対して使う方法
919デフォルトの名無しさん:2014/05/13(火) 11:11:36.24 ID:3oieHFyI
>>918
了解しましたです。ありがとうございます。
920デフォルトの名無しさん:2014/05/13(火) 12:41:31.19 ID:oNeP8dL2
>>914
毎年、客から支給されるデータをマクロで整形してDTPソフトに貼り込む作業なもんで。
921デフォルトの名無しさん:2014/05/13(火) 19:25:34.15 ID:/l0lTNTz
>>920
参照設定はプログラムモジュールを指定するもの
データが変わろうが、参照設定は変わらんだろ
922デフォルトの名無しさん:2014/05/14(水) 00:44:43.93 ID:4NYZ0gDe
>>921
確か参照設定はブックに依存するのではなく、
アプリケーション側に依存したはず。
つまり参照設定していない他のPC上にあるEXCELでそのブックを立ち上げても
ダメだったんじゃなかったかな。
違ってたらごめん。
923デフォルトの名無しさん:2014/05/14(水) 01:44:23.14 ID:k2UyUu49
>>922
お前の環境では、あるブックに参照設定したらすべてのエクセルファイルでその参照設定が有効になってるのか?

つか、今のエクセル、未使用の参照設定勝手に外して保存しやがるな
それだけじゃなく、未使用のコードも勝手に消されてる
なんつう迷惑な事しやがるんだ
924デフォルトの名無しさん:2014/05/14(水) 19:48:14.68 ID:9e1uL7m3
>未使用のコードも勝手に消されてる

オプションで清掃が有効になってない?
925デフォルトの名無しさん:2014/05/15(木) 11:36:12.81 ID:xP8vZsnc
>>924
その 清掃 とかいうオプションはどこにある?
926デフォルトの名無しさん:2014/05/15(木) 20:30:44.53 ID:Mes52j2B
馬鹿には無理
927デフォルトの名無しさん:2014/06/06(金) 17:56:50.11 ID:xrGe04ue
Functionで返り値に動的配列とすることは可能ですか?
その場合どんなコードになりますか?
928デフォルトの名無しさん:2014/06/06(金) 18:58:23.21 ID:nBXq1INX
>>927
Function ar(cnt As Integer) As Variant
Dim ret() As Integer
ReDim ret(cnt)
ar = ret
End Function
929デフォルトの名無しさん:2014/06/06(金) 19:29:10.75 ID:xrGe04ue
>>928
あれれ?おかしいですよ。
返り値はVariantなのにそのプロシージャ内ではInteger。
こんなこと許される?
930デフォルトの名無しさん:2014/06/06(金) 19:29:56.02 ID:xrGe04ue
Dim ret() As Integer
ReDim ret(cnt)

をまとめて

Dim ret(cnt) As Integer

にしちゃ問題あるの?
931デフォルトの名無しさん:2014/06/06(金) 20:56:58.40 ID:2p7Hju+q
>>930
そんなことできない
932デフォルトの名無しさん:2014/06/06(金) 20:59:12.41 ID:xrGe04ue
>>931
それはなぜですか?
933デフォルトの名無しさん:2014/06/06(金) 21:07:05.43 ID:fJT63IUR
何故と言われてもVBAのお作法みたいなもんだしな
934デフォルトの名無しさん:2014/06/06(金) 21:12:39.28 ID:2p7Hju+q
>>932
VBAのルールで、Dimの中で配列のサイズに変数は使えない、と決まっているから
実際にやってみればエラーが出るからすぐ確認できる
935デフォルトの名無しさん:2014/06/06(金) 21:27:08.12 ID:xrGe04ue
そうでござったか
936デフォルトの名無しさん:2014/06/07(土) 11:14:14.46 ID:7p+CDDc/
ワークシート main のC7に作業時刻を入れています eg 10:30

前回作業時刻よりも1時間以降経過した後でないと同じ作業は出来ないようにしたいのですが、、、
If Now() < DateAdd("h", 1, Worksheets("main").Cells(7, 3)) Then
MsgBox "前回作業時刻よりも1時間経っていません。" & vbCrLf & _
DateAdd("h", 1, Worksheets("main").Cells(7, 3)) & " 以降に作業してください"
Exit Sub
Else
MsgBox "現在時刻:" & Format(Now(), "hh:mm") & vbCrLf & _
"直前作業時刻より1時間後:" & DateAdd("h", 1, Worksheets("main").Cells(7, 3))
End If
とすると、
現在時刻:11:12
直前作業時刻より1時間後:11:30:00
となってElse以降しか実行しません

時刻の比較ってどうするんでしたっけ?
937デフォルトの名無しさん:2014/06/07(土) 15:30:59.32 ID:SxbAzKvi
.TIMEVALUE()
938デフォルトの名無しさん:2014/06/07(土) 16:25:46.19 ID:7p+CDDc/
ありがとう

If TimeValue(Now()) < TimeValue(DateAdd("h", 1, Worksheets("main").Cells(7, 3))) Then
でElse以前が動作できるようになりました
939デフォルトの名無しさん:2014/06/07(土) 17:38:13.17 ID:qI6lrvl+
>>938
Cells(7, 3)に入ってる時刻がシリアル値なら、そんな長い式を書かなくてもこれでいける

If Now() < Worksheets("main").Cells(7, 3) + #1:00:00# Then
940デフォルトの名無しさん:2014/06/07(土) 17:41:53.05 ID:qI6lrvl+
あ、ごめん。今のなし
日付込みだとおかしくなる
ワークシート上のシリアル値は1900/1/1になってる可能性があるから
941デフォルトの名無しさん:2014/06/07(土) 18:42:33.53 ID:FLlpq6Lc
VBAは気づいたらワークシート関数とか一切使ってなかった
じゃVB6で良かったんじゃね?みたいな事になるよね
942デフォルトの名無しさん:2014/06/07(土) 18:49:17.07 ID:qI6lrvl+
ちょっとした計算とか確認程度なら、モジュールすら作らずにイミディエイトウィンドウでやっちゃう
コンパイルどころかソースファイルすら作る必要がないという手軽さは他の処理系では真似できない
943デフォルトの名無しさん:2014/06/07(土) 19:25:35.22 ID:SxbAzKvi
944デフォルトの名無しさん:2014/06/10(火) 02:49:48.07 ID:YTnem67I
windows7, office2010を使っています

data1,data2,data4が同じフォルダに入っている場合に、
存在しないdata3を飛ばしてファイルをすべて開くというテストプログラムを作っています

Sub test()
Dim I As Long
For I = 1 To 4
If Dir("C:\excel\dataI.xlsx") <> "" Then
Workbooks.Open "C:\excel\dataI.xlsx"
Else
End If
Next I

End Sub

これだとエラーは出ませんが、どのファイルも開きません
Iが文字として認識されているためにelse条件に引っかかっているのだと
思うのですが、ファイル名中のIを変数として認識させる方法はないでしょうか?
同じフォルダ中のファイルをすべて開く方法ならあるようですが、それだと意味が
ないのです。わかる方がいましたらよろしくお願いいたします。
945デフォルトの名無しさん:2014/06/10(火) 03:33:00.72 ID:hc4LiDN+
>>944
Sub test()
  Dim I As Integer
  For I = 1 To 4
    If Dir("C:\excel\data" & I & ".xlsx") <> "" Then
      Workbooks.Open "C:\excel\data" & I & ".xlsx"
    End If
  Next I
End Sub
946デフォルトの名無しさん:2014/06/10(火) 04:40:54.93 ID:ZdnvVnA2
Dir使うなら、ワイルドカードを使ったこんな方法もある

Dim fn As String
fn = Dir("C:\excel\data*.xlsx")
Do Until (fn = "")
  If fn Like "data#.xlsx" Then Workbooks.Open "C:\excel\" & fn
  fn = Dir()
Loop

C:\excel 内の data数字.xlsx を全て開くというもの

まあ、「同じフォルダ中のファイルをすべて開く」の発展型みたいなもので
同じ方式を使いながら、対象を「すべて」ではなくDirとLikeで絞り込むだけの話
947デフォルトの名無しさん:2014/06/10(火) 10:36:42.20 ID:zXPv5kx2
>>945
ありがとうございます
Iを"と&amp;で挟むことは私も試したんですが、エクセルは両方で挟むんですね
これで行けそうです

>>946
ありがとうございます
今回はちょっと事情が特殊なんですが、普通ならこっちのほうがスマートな気もしますね。
勉強になりました。
948デフォルトの名無しさん:2014/06/12(木) 22:39:19.22 ID:JGtl8L6J
日別の購入データの通し番号から、マスターを参照してジャンル分けして、ジャンルごとの合計金額を出したいです。

http://light.dotup.org/uploda/light.dotup.org28231.png

データはこのような画像の通りにシート3つに分かれて存在しています。
どのようなマクロを組めばいいかお教え願いたいです。
ジャンルごとに変数というものを持たないといけないのでしょうか?
実際は母が使うので、ボタン一つで出来るのだとありがたいのですが・・・
大変面倒な質問ですが、お願いします

具体的なコードを教えてください
本当に困っていますお願いします
949デフォルトの名無しさん:2014/06/12(木) 23:30:41.76 ID:Edw1tGKl
>>948
丸投げしたいのなら、完全な状態のブックをどっかにアップしてください
本当に困っていますお願いします
950デフォルトの名無しさん:2014/06/13(金) 14:09:52.76 ID:+wg+XXRx
 
>>1
> ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
>    コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
>    ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
951デフォルトの名無しさん:2014/06/13(金) 14:29:39.15 ID:QETwEf+A
>>949-950
本スレとマルチだし、向こうでかなり暴れてたから
もうこっちには来ないと思う。
952デフォルトの名無しさん:2014/06/14(土) 13:12:04.56 ID:i5Ueiwm/
プリンターの無い家で印刷に関するマクロを組みたいのですが
印刷の代わりに使える分かりやすい言葉はないですか?
953デフォルトの名無しさん:2014/06/14(土) 14:15:23.09 ID:NIfTAMoH
>>952
バーチャルプリント
954デフォルトの名無しさん:2014/06/14(土) 14:54:03.19 ID:i5Ueiwm/
>>953
如何にもな言葉してますね…
ありがとうございます助かりました!
955デフォルトの名無しさん:2014/06/24(火) 08:53:44.32 ID:A58N03NN
セルに「hoge hoge、huga huga」みたいに入力されていて、
先頭の文字と「、」の後の一文字だけ大文字にすることってできるかな?

PROPERを使うと、Hoge Hoge、Huga Hugaみたいになるし、
UPPERは特定の文字だけ変換する方法わからんし、
できれば関数で簡単に処理したいんですが、無理かな?
956デフォルトの名無しさん:2014/06/24(火) 09:44:48.41 ID:qWqYgHU9
>>955
普通に「、」でSplitして、ループ内で1文字目だけ大文字に変換して、Joinで再連結すればいいんじゃね?
関数にしたいなら、それを関数として定義すれば良いだけのことだし

1文字目だけ大文字にする方法はいくつかあるが
Midの関数ではなくステートメントの方を使うのが簡単かもな
957デフォルトの名無しさん
>>956
そっかー。
簡単にできる関数が用意されてないかな?と思ったんだけど、無いんだね。

わざわざVBA作るほど沢山あるわけじゃないから、手で治すことにするよ。
アドバイスごち