• ベストアンサー

ExcelのVBAについて

こんにちは、VBA初心者です。 C:\pictureの中に以下のファイルがあります。 DSC_0134.JPG~DSC_0154.JPG これらのファイルをExcelのA列1~20行に書かれた文字△○%&◎~▲▽%%★に.JPGをつけて保存したくて以下のコードを書きました。 Dim buf As String Dim msg As String Dim i As Integer Dim A As Variant i = 1 buf = Dir("dsc*.jpg", vbNormal) Do While buf <> "" Do While i < 21 buf = Dir() msg = buf 'msg=元の名前 A = Worksheets("sheet1").Cells(i, 1).Value     Worksheets("sheet1").Cells(i, 2).Value = msg          Name "C:\picture\msg" As "C:\picture\A.jpg"     i = i + 1 Loop Loop Name "C:\picture\msg" As "C:\picture\A.jpg"のところで、「ファイルがありません。」となってしまいます。 あと、Worksheets("sheet1").Cells(i, 2).Value = msgのところで、\pictureの中の最初のファイル(DSC_0134.JPG)を表示しません。 どこを直せばよいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • starsip
  • ベストアンサー率36% (22/60)
回答No.4

参考までに i = 1 buf = Dir("dsc*.jpg", vbNormal)'←ここでbuf=""となる? Do While buf <> "" Do While i < 21 buf = Dir() '↑もしもbuf = Dir("dsc*.jpg", vbNormal)でファイル名を取得してもここで次のファイル名を取得し直す。 msg = buf 'msg=元の名前 A = Worksheets("sheet1").Cells(i, 1).Value     Worksheets("sheet1").Cells(i, 2).Value = msg          Name "C:\picture\msg" As "C:\picture\A.jpg" '←msgという名のファイルを指定しているからファイルがない。     i = i + 1 Loop Loop なので以下コードで試して下さい。 i = 1 buf = Dir("C:\picture\dsc*.jpg", vbNormal)'パスを指定 Do While buf <> "" Do While i < 21 msg = buf 'msg=元の名前 A = Worksheets("sheet1").Cells(i, 1).Value     Worksheets("sheet1").Cells(i, 2).Value = msg          Name "C:\picture\" & msg As "C:\picture\" & A & ".jpg" '文字と変数を & で繋ぐ buf = Dir()'次のファイルを指定する位置を変更     i = i + 1 Loop Loop 但し、 Do While buf <> "" へLoopする(戻る)順番が正しいか検討して下さい。

mr-boku
質問者

お礼

参考になりました。ありがとうございます。

その他の回答 (4)

  • starsip
  • ベストアンサー率36% (22/60)
回答No.5

#4です。 ちなみに Do While buf <> ""  Do While i < 21   ↑ ↓   ↑ ↓   ↑ ↓  Loop Loop これでは i が 21になるまでは Do While buf <> "" へ戻らないのでは? 故に例(1) c:\picture\内に20個のファイルがないと ( 例えば15個しかないと16回目は buf="" msg=buf(="") ・・・・ ・・・・ Name"C:\pictuer\ & msg(="")・・・・・・As ・・・・・・ ""という名前のファイルはないからエラー 例(2) c:\picture\内に21個のファイルがあると  Do While i < 21   ↑ ↓   ↑ ↓   ↑ ↓  Loop 21回目に Do While buf <> "" に戻るが buf <> "" でないので(buf=21個目のファイル名) 最後の Loop へ飛んで21個目(以降)のファイル名は変更しない! ----------------------------------------------- そこで Do While i < 21 Loop ではなく For i=1 to 20 Next を使ったら私は可能でした。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

Name "C:\picture\msg" As "C:\picture\A.jpg" を Name "C:\picture\" & msg As A & ".jpg" といった具合に変更しましょう 文字定数(リテラル)と変数の区別をしましょう

mr-boku
質問者

お礼

区別するように気をつけます。ありがとうございます。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

ANo.1です。 >msg = buf >を >msg = Replace(buf,"C:\picture\msg\","") ここは余計だったです。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

buf = Dir("C:\picture\dsc*.jpg", vbNormal) と変数の使い方が変。 "C:\picture\msg"⇒"C:\picture\" & msg ですが、 msgにファイル名だけを入れたいのなら、 msg = buf を msg = Replace(buf,"C:\picture\msg\","") でしょうか。

mr-boku
質問者

お礼

なるほど、ありがとうございます。

関連するQ&A

専門家に質問してみよう