VBAで複数のパターンのファイル名を読み込む方法

このQ&Aのポイント
  • VBAを使用して、複数のパターンのファイル名を読み込む方法を探しています。写真のファイル名のパターンが異なる場合でも対応できる方法を知りたいです。
  • C言語のように#defineによる置き換えができれば、一か所のみ修正すれば対応できると便利だと思いますが、VBAでは#defineに相当する機能がないようです。
  • プログラム全体を修正せずにファイル名のパターンを変更できる方法を知りたいです。if文で分岐させる方法は最終手段として考えています。
回答を見る
  • ベストアンサー

vbaで複数のパターンのファイル名を読み込みたい

例えば、11.jpg~79.jpgの画像を読み込むとします。 これをvbaで記述すると j & i & ".jpg" となります(1の位と10の位の数字は独立していると考えてください) これを、1-1.jpg~7-9.jpg といった形式をvbaで記述すると、 j & "-"& i & ".jpg" となります。 これをvbaで記述させるときに、これをA1のセルに「ji」や、「j-i」や、「i」、「j」と入力させたときに様々なパターンに対応させたいと考えております。 (他の方法でもいいです。やりたいことは、複数パターンのファイル名に対応させたいという事です。) いちいち、写真のファイル名のパターンが違うたびにコード書き直すのも面倒ですし、プログラムわからない人には読み込ませることすらできないです。 4パターンだったら、if文で分けちゃえば?という人もいるでしょうが、それは最終手段として残しておきたいです(プログラムがえらい長くなり、後々の修正が大変だし、パターンが増えるたび追加しなければならないので) せめて、C言語のように#defineによる置き換えができれば、 #define PATARN j & "-"& i として、「一か所のみ修正すれば楽ちん」みたいなことができればいいんですけれども、 VBAで、C言語の#defineに該当するものが何かよくわかりません。 (プログラム本文にはPATARNに該当する箇所が何か所かあるので、修正が大変なんです) もし必要ならと思い、ソースの一部を書いておきます(主要なところだけ残して、後はざっくり削除しています) やってることは、写真を挿入して、規則的に並べて、JPEG変換しています (下のコードは写真の挿入のみ) Sub 写真挿入→JPEG変換() On Error Resume Next Dim flag As Integer Dim xoffset As Integer Dim yoffset As Integer Dim Ystart As Integer Dim i As Integer Dim j As Integer Dim Xstart As Integer Dim str As String Dim Er As String Xstart = 1 Dim Xend As Integer Dim Yend As Integer flag = 0 xoffset = 1 yoffset = 1 Ystart = 1 Yend = 6 Xend = 6 Application.ScreenUpdating = False For j = Xstart To Xend For i = Ystart To Yend ActiveSheet.Pictures.Insert(ActiveWorkbook.Path & _ j & i & ".jpg").Select If i = Yend Then Else If flag = 0 Then ActiveCell.Offset(yoffset, 0).Range("A1").Select ElseIf flag = 1 Then ActiveCell.Offset(0, xoffset).Range("A1").Select End If End If Next If flag = 0 Then ActiveCell.Offset(-(Yend - Ystart) * yoffset, xoffset).Range("A1").Select ElseIf flag = 1 Then ActiveCell.Offset(yoffset, -(Yend - Ystart) * xoffset).Range("A1").Select End If Next Application.ScreenUpdating = True End Sub

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

Option Explicit Const ptn = "ji" Sub test()   Dim a As Long   Dim b As Long   Dim sa As String   Dim sb As String      For a = 1 To 2     sa = Replace$(ptn, "j", CStr(a))     If InStr(ptn, "i") = 0 Then       MsgBox ActiveWorkbook.Path & "\" & sa & ".jpg"     Else       For b = 1 To 2         sb = Replace$(sa, "i", CStr(b))         MsgBox ActiveWorkbook.Path & "\" & sb & ".jpg"       Next     End If     If InStr(ptn, "j") = 0 Then Exit For   Next End Sub こんな感じですね。 または、A1セルに入力されたパターンを読み込ませるなら Option Explicit Sub test()   Dim a  As Long   Dim b  As Long   Dim sa As String   Dim sb As String   Dim ptn As String      ptn = Range("A1").Value   For a = 1 To 2   : という感じ。 いずれにしても、パターンを文字列型変数に設定して ループカウンタと置き換えてあげれば良いかと思います。

iori16
質問者

お礼

これは凄い。 まさに、パーフェクトな答えです。 知らない関数がいくつか見られたので調べて理解してみようと思います。 ありがとうございました

その他の回答 (2)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

> ActiveSheet.Pictures.Insert(ActiveWorkbook.Path & _ > j & i & ".jpg").Select 結局のところ、ここのパターンを代えるだけでしょ? 事前に"ファイル名"を生成する部分を追加し、変数に格納(Ex:strFileName) する(=IFかSelectCase文)しか無いのでは? ActiveSheet.Pictures.Insert(ActiveWorkbook.Path & _ strFileName).Select

iori16
質問者

お礼

回答ありがとうございます。 そういうのも考えたんですが、strFileName=j-i と置くと "(パス名)\j-i.jpg"という感じに読み込まれてしまって上手くいきませんでした。 ハッ for文の中に strFileName=j & "-" & i  と入れれば良かったのか・・・ 今気づきました。申し訳ありません。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

> これをvbaで記述すると j & i & ".jpg" となります(1の位と10の位の数字は独立していると考えてください) 何のことだか、わからない。初心者的発想では。 ファイル名は (1)普通フルで入力させる (2)文字列的にリストから選択させる (3)今までにに作ったファイル名もあわせて掲示し、ダイアロウグで表示して入力させる。 などが多い。 ーー たとえファイル名が2つの意味的な部分に分かれているにしても、2つを分けて入力させて合成などするのは 使う人が困惑するのでは。 文字部+番号部の番号部ぐらいは新しい数字文字を案内することはあっても良いかも。 >、プログラムわからない人には読み込ませることすらできないです なんていっているが、この質問が、珍奇な発想では。 実際に回りにいる人に実例(コードではない)を示してどれが、素直に判りやすいか聞いてみたら。 こんな質問コーナーに質問するよりよほど大切な態度だと思う。

iori16
質問者

お礼

確かに、自分のやっていることは分かりづらいものでしたね・・・ 他人に使わせるとしたら、分かりづらかったです。 素直に、周りの人にどんな感じがいいか聞いてみます。 実際上司にも、連番で入力することは少ないんじゃないかって言われました。

関連するQ&A

  • vba  

    VBAはじめたばかりで、躓きました。 下記を実行すると、”Nextに対するForがありません。”とでます。 なぜこうなるのか教えてください。  G2~列2000の間が空白になるまで、  下記の処理を続けるようにしたいと思っています。  Dim i As Integer For i = 7 To 2000 Do If Cells(2, i) = "" Then Range("G2").End(xlToRight).Select ActiveCell.CurrentRegion.Resize(6, 5).Select Selection.Cut Range("B2").End(xlDown).Select ActiveCell.Offset(1).Select ActiveSheet.Paste Exit Do End If Next i Loop  よろしくお願いします。

  • EXCEL VBA

    EXCEL VBAで空白行が現れたら「小計」の文字を入力したいと思い以下のように記述しましたが、うまくいきません。どこがおかしいのか教えてください。 宜しくお願いします。 Sub write小計() Dim i As Integer Dim rowcnt As Integer rowcnt = Cells(1, 1).CurrentRegion.Rows.Count Range("B1").Select For i = 1 To rowcnt If Cells(i, 2).Value = "" Then Value = "小 計" ActiveCell.Offset(1).Select Next i End Sub

  • VBAの書き方を教えてください 3

    何度も申し訳ございません。 以前にもこちらで質問させて頂いている者です。 Sheet1のrange("A1")をVLOOKUPで検索後の文字を取得し、同じ名前のシートを検索し、さらにrange("A1000")をアクティブにしてここからコードをつなげて処理しています。 range("A1")の処理が終わったら、range("A2")の処理に入り、range("A3") range("A4")を続けて処理を行っているのですが、range("A4")でVLOOKUPの検索が空白の場合、On Error GoTo myErrorで次のrange("A5")の処理に入りますが、On Error Gotoは1回のみの処理しかできないみたいで、range("A5")が空白の場合、実行時エラー9が発生してしまいます。 教えて頂いたコードを解読し、On Error Resume Nextなどを使おうとしているのですが、上手くできません。 1から10まで質問しっぱなしなのですが、どなたかご協力を頂けないでしょうか。 とりあえず自分の必要なコードはある程度省いて、2つ分のみ記載します。 本来この後、10回同じ処理を行います。 よろしくお願い致します。 Private Sub 記帳_Click()  On Error GoTo myError1  Dim i As Long  Dim myFlg As Boolean    For i = 1 To worksheets.Count If worksheets(i).Name = Range("A1").Value Then myFlg = True Exit For End If Next i If myFlg = True Then With worksheets(i) .Activate .Range("A1000").End(xlUp).Select    ActiveCell.Offset(1, 0).Select   ActiveCell = Range("J1") ActiveCell.Offset(0, 1).Select ActiveCell = Range("K1") End With Else MsgBox "該当シートなし" End If myError1: On Error GoTo myError2 For i = 1 To worksheets.Count If worksheets(i).Name = Range("A2").Value Then myFlg = True Exit For End If Next i If myFlg = True Then With worksheets(i) .Activate .Range("A1000").End(xlUp).Select ActiveCell.Offset(1, 0).Select   ActiveCell = Range("J1") ActiveCell.Offset(0, 1).Select ActiveCell = Range("K1") End With Else MsgBox "該当シートなし" End If End sub

  • VBAが止まります。

    皆さん、いつもありがとうございます。 下から14行目の『 objMail.Attachments.Add asrs1』で止まってしまします。 下から14行目の『 objMail.Attachments.Add asrs1』で止まってしまします。 asrs1をadrs1へ修正したりしましたが、改善されません。 昨日まで動いたいたのですが。 皆様、修正方法を教えていただけますでしdょうか。 ------------------------------------------------------- Sub メール作成() Dim objOutlook As Outlook.Application Dim objMail As Outlook.MailItem Dim wsMail As Worksheet Dim filead As String Dim tenp1 As String Dim tenp2 As String 'メール立ち上げ Set objOutlook = New Outlook.Application Set wsMail = ThisWorkbook.Sheets("リスト") '添付ファイルのアドレスを変数にする filead = Worksheets("リスト").Range("B3").Value '共通添付データのアドレスを読む tenp1 = filead & "\" & Worksheets("リスト").Range("B4") tenp2 = filead & "\" & Worksheets("リスト").Range("B5") Dim kobetsumail1 As String Dim kobetsumail2 As String Dim adrs1 As String Dim asrs2 As String '変数iを設定。最初は1 Dim i As Long i = 1 '送付前の確認メッセージ Dim rc As Long rc = MsgBox("記載に誤りが無いことを確認しましたか?", vbYesNo + vbQuestion, "確認") If rc = vbNo Then MsgBox "中断しました" End End If '基準となるセルを選択 Worksheets("リスト").Select Range("B7").Select '取引先名が書かれているB列が空欄になるまで続ける Do Until ActiveCell.Offset(i, 0).Value = "" '送付チェック欄が○なら作業を続ける If ActiveCell.Offset(i, 2).Value = "○" Then Set objMail = objOutlook.CreateItem(olMailTtem) '個別メールのデータ名称を読む Dim CC12(1) As String CC12(0) = ActiveCell.Offset(i, 6).Value CC12(1) = ActiveCell.Offset(i, 8).Value 'メールを作成する With wsMail objMail.to = ActiveCell.Offset(i, 4).Value objMail.CC = Join(CC12, ";") objMail.Subject = Range("B1").Value objMail.Bodyformat = olFormatPlain objMail.body = Range("B7").Offset(i, 0) & vbCrLf & Range("E7").Offset(i, 0) & "様" & vbCrLf & vbCrLf & Range("B2").Value & vbCrLf & vbCrLf kobetsumail1 = ActiveCell.Offset(i, 9).Value asrs1 = filead & "\" & kobetsumail1 kobetsumail2 = ActiveCell.Offset(i, 10).Value asrs2 = filead & "\" & kobetsumail2 If Range("B4").Value <> "" Then objMail.Attachments.Add tenp1 End If If Range("B5").Value <> "" Then objMail.Attachments.Add tenp2 End If If ActiveCell.Offset(i, 9).Value <> "" Then objMail.Attachments.Add asrs1 End If If ActiveCell.Offset(i, 10).Value <> "" Then objMail.Attachments.Add asrs2 End If objMail.Display objMail.Save End With End If i = i + 1 Loop Set objOutlook = Nothing MsgBox "下書きに保管しました" End Sub

  • VBAでoutlook365が起動しません。

    VBAでoutlook365が起動しません。EXCELまたは、OUTLOOK設定がおかしいのでしょうか。 メール一括作成のボタンを押しても『記載に誤りが無いことを確認しましたか?』『"送信完了しました』のメッセージは出るのですが、outlookが起動しませんし下書ホルダにも保存されません。 EXCELは他のマクロは動作しますし、Outlookはセキュリティ(トラストセンター)設定も有効です。どなたかご教示いただけますようお願いいたします。 添付でEXCEL画面の画像と下記に対象の記述を記します。 ------------------------------------------------------- Sub メール作成() Dim objOutlook As Outlook.Application Dim objMail As Outlook.MailItem Dim wsMail As Worksheet Dim filead As String Dim tenp1 As String Dim tenp2 As String 'メール立ち上げ Set objOutlook = New Outlook.Application Set wsMail = ThisWorkbook.Sheets("リスト") '添付ファイルのアドレスを変数にする filead = Worksheets("リスト").Range("B3").Value '共通添付データのアドレスを読む tenp1 = filead & "\" & Worksheets("リスト").Range("B4") tenp2 = filead & "\" & Worksheets("リスト").Range("B5") Dim kobetsumail1 As String Dim kobetsumail2 As String Dim adrs1 As String Dim asrs2 As String '変数iを設定。最初は1 Dim i As Long i = 1 '送付前の確認メッセージ Dim rc As Long rc = MsgBox("記載に誤りが無いことを確認しましたか?", vbYesNo + vbQuestion, "確認") If rc = vbNo Then MsgBox "中断しました" End End If '基準となるセルを選択 Worksheets("リスト").Select Range("B7").Select '取引先名が書かれているB列が空欄になるまで続ける Do Until ActiveCell.Offset(i, 0).Value = "" '送付チェック欄が○なら作業を続ける If ActiveCell.Offset(i, 2).Value = "○" Then Set objMail = objOutlook.CreateItem(olMailTtem) '個別メールのデータ名称を読む Dim CC12(1) As String CC12(0) = ActiveCell.Offset(i, 6).Value CC12(1) = ActiveCell.Offset(i, 8).Value 'メールを作成する With wsMail objMail.to = ActiveCell.Offset(i, 4).Value objMail.CC = Join(CC12, ";") objMail.Subject = Range("B1").Value objMail.Bodyformat = olFormatPlain objMail.body = Range("B7").Offset(i, 0) & vbCrLf & Range("E7").Offset(i, 0) & "様" & vbCrLf & vbCrLf & Range("B2").Value & vbCrLf & vbCrLf kobetsumail1 = ActiveCell.Offset(i, 9).Value asrs1 = filead & "\" & kobetsumail1 kobetsumail2 = ActiveCell.Offset(i, 10).Value asrs2 = filead & "\" & kobetsumail2 If Range("B4").Value <> "" Then objMail.Attachments.Add tenp1 End If If Range("B5").Value <> "" Then objMail.Attachments.Add tenp2 End If If ActiveCell.Offset(i, 9).Value <> "" Then objMail.Attachments.Add asrs1 End If If ActiveCell.Offset(i, 10).Value <> "" Then objMail.Attachments.Add asrs2 End If objMail.Display End With End If i = i + 1 Loop Set objOutlook = Nothing MsgBox "送信完了しました" End Sub

  • excel vbaでの質問になります

    このようなマクロを作成したのですが、セルに数式が入れてあると、どうしてもその下の空白の行に値を入力されてしまいます。 数式が入っているセルにもそのままセルに値を入れたいのですが・・ 宜しくお願いします。 Dim wb1 As Worksheet, r1 As Range Dim N As Integer, i As Integer Dim mycount As Long   Set wb1 = ThisWorkbook.Worksheets("請求書") mycount = Range("B111").CurrentRegion.Rows.Count Cells(111 + mycount, 2).Select ActiveCell.Offset(0, 0).Value = wb1.Range("C60").Value ActiveCell.Offset(0, 1).Value = wb1.Range("C61").Value ActiveCell.Offset(0, 12).Value = wb1.Range("C66").Value ActiveCell.Offset(0, 13).Value = wb1.Range("C74").Value ActiveCell.Offset(0, 14).Value = wb1.Range("C75").Value ActiveCell.Offset(0, 15).Value = wb1.Range("C84").Value ActiveCell.Offset(0, 16).Value = wb1.Range("C85").Value ActiveCell.Offset(0, 20).Value = wb1.Range("C69").Value ActiveCell.Offset(0, 22).Value = wb1.Range("C68").Value ActiveCell.Offset(0, 23).Value = wb1.Range("C76").Value ActiveCell.Offset(0, 24).Value = wb1.Range("C77").Value Exit Sub

  • VBAで特定の文字が含まれている画像ファイル

    下記コードで画像の貼り付けを行っていますが 現在は適当な順番で貼り付けが行われます。 Declare Function SetCurrentDirectory Lib "kernel32" Alias _ "SetCurrentDirectoryA" (ByVal CurrentDir As String) As Long Sub ShapeLoadtest() Dim Fname As Variant, fe As Variant Dim Fn As Variant, Pic As Shape Dim pno As Long Dim myFileName As String Dim strFileName As String Range("B4").Select SetCurrentDirectory "C:\Users\yuya\Desktop\画像\" Fname = Application.GetOpenFilename _ (",*", MultiSelect:=True) If Not IsArray(Fname) Then MsgBox "取り消されました。", vbInformation Exit Sub End If Application.ScreenUpdating = False pno = 0 For Each Fn In Fname 'この次へ追加すべき行 Selection.Offset(-1, 0) = Mid(Fn, InStrRev(Fn, "\") + 1, Len(Fn) - InStrRev(Fn, "\")) ActiveCell.Select Set Pic = ActiveSheet.Shapes.AddPicture(Filename:=Fn, _ LinkToFile:=False, _ SaveWithDocument:=True, _ Left:=0, Top:=0, Width:=0, Height:=0) With Pic .ScaleWidth 1, msoTrue .ScaleHeight 1, msoTrue .Top = ActiveCell.Top ' 位置:アクティブセルの上側に重ねる .Left = ActiveCell.Left ' 位置:アクティブセルの左側に重ねる .Placement = xlMove ' 移動するがサイズ変更しない End With If ActiveCell.Column = 2 Then ActiveCell.Offset(, 8).Select ElseIf ActiveCell.Column = 10 Then ActiveCell.Offset(, 8).Select ElseIf ActiveCell.Column = 18 Then ActiveCell.Offset(32, -16).Select End If Set Pic = Nothing pno = pno + 1 Next Application.ScreenUpdating = True Range("A1").Select MsgBox pno & "枚の画像を挿入しました", vbInformation End Sub これを画像ファイル名に【あいう】という文字が混じっていたら If ActiveCell.Column = 2 Then ActiveCell.Offset(, 8).Select のセルに 【123】という数字が混じっていたら ElseIf ActiveCell.Column = 10 Then ActiveCell.Offset(, 8).Select のセルに貼り付けという具合にしたいです。 よろしくお願いします。

  • vba  対象セルが空白の間動作を繰り返すには?

    下記を走らせると、セルが右端まで行ってとまります。 そうなる前に、対象セル範囲が空白になった時点で、動作を止めたいのですが どう記述するのがいいでしょうか? Dim u As Integer, o As Integer Application.Calculate For u = 2 To 3 For o = 7 To 2000 If Cells(u, o) = "" Then Range("G2").Select Range("G2").End(xlToRight).Select ActiveCell.Resize(6, 5).Select Selection.Cut Range("B2").Select Range("B2").End(xlDown).Select ActiveCell.Offset(1).Select ActiveSheet.Paste End If Next o Next u End Sub

  • VBA Do Until内で値の貼り付けができない

    Excel2003を使用しております。 コピー&値のペースト作業をやってくれるマクロを作成しております。 具体的には、名簿に公がついていれば、その3つ左の名前をD27へ値のみコピペし、 D27がすでに値があれば、D28に書くことを、D37までループするようにしております。 しかし困ったことに、Do Untilコードを使用しておりますが、このコードではなぜか値の貼り付けが出来なくなります。 Sub Ns公() Dim work As Range Set work = Selection If Selection.Value = "公" Then ActiveCell.Offset(0, -3).Select Selection.Copy Do Until Range("D37").Select Range("D27").Select If Selection.Value = "" Then Selection.PasteSpecial paste:=xlPasteValues work.Select Else ActiveCell.Offset(1).Select End If Loop If Range("D36").Value <> "" Then Do Until Range("I37").Select Range("I27").Select If Selection.Value = "" Then Selection.PasteSpecial paste:=xlPasteValues work.Select Else ActiveCell.Offset(1).Select End If Loop work.Select End If work.Select End If work.Select ActiveCell.Offset(1).Select End Sub 原因や対策をご教授いただけるとうれしいです。よろしくお願いします。

  • VBA OR条件での検索について教えてください。

    VBA初心者です。また質問させてください。 以前、下記のような表で、『小計』の文字を検索して行を挿入したり、斜め線を引くという内容をVBAでやる方法を教えていただきました。 その節はありがとうございました。 *************************************************************   A    B       C    D 1  2  項目 品名       数量   単位 3     内訳(別紙明細) 1     式 4     ブレーカ      1     ヶ 5     消耗品       1     式   6             7 8           小計 ************************************************************* 今度は『小計』だけでなく『合計』があった場合も、同じ処理をするVBAを作成したいのですがうまくいきません。 以下が記述です。 ************************************************************* Private Sub 斜め線描画_Click() Dim myLine As Shape Dim c As Range Dim cnt As Integer Dim i As Integer cnt = WorksheetFunction.CountIf(Cells, "*小   計*") Set c = Cells.Find(What:="小   計", LookIn:=xlFormulas, LookAt:=xlPart) If Not c Is Nothing Then i = 1 Call LineArranging(c) Do If i >= cnt Then Exit Sub 'カウントでチェック Set c = Cells.FindNext(c) If c Is Nothing Then Exit Sub Call LineArranging(c) i = i + 1 Loop End If Set c = Nothing End Sub Sub LineArranging(rng As Range) Dim BX As Double, BY As Double, EX As Double, EY As Double Dim rngStart As Range, rngEnd As Range Dim myLine As Shape rng.Select ActiveCell.Rows("1:2").EntireRow.Select Selection.Insert Shift:=xlDown rng.Offset(1, 0).Select ActiveCell.Rows("1:2").EntireRow.Select Selection.Insert Shift:=xlDown rng.Offset(-2, 0).Select Selection.EntireRow.Insert ActiveCell.EntireRow.Select Selection.RowHeight = 2 rng.Offset(1, 0).Select Selection.EntireRow.Insert ActiveCell.EntireRow.Select Selection.RowHeight = 2 Set rngStart = rng.Offset(1, -1) Set rngEnd = rng.Offset(-2, 0) BX = rngStart.Left BY = rngStart.Top EX = rngEnd.Left + rngEnd.Width EY = rngEnd.Top Set myLine = Sheet4.Shapes.AddLine(BX, BY, EX, EY) BX = BX + 151.5 BY = BY - 27 EX = EX - 152.25 EY = EY + 26.25 Set myLine = Sheet4.Shapes.AddLine(BX, BY, EX, EY) Set rngStart = Nothing Set rngEnd = Nothing Set myLine = Nothing End Sub ************************************************************* 『または』なのでorを使うのかと思ったのですが、エラーになりうまくいきません。どうしたらいいのか教えてください。 よろしくお願いします。

専門家に質問してみよう