プロが教えるわが家の防犯対策術!

例えば、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

A 回答 (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
  :
という感じ。
いずれにしても、パターンを文字列型変数に設定して
ループカウンタと置き換えてあげれば良いかと思います。
    • good
    • 0
この回答へのお礼

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

ありがとうございました

お礼日時:2011/06/24 21:35

> ActiveSheet.Pictures.Insert(ActiveWorkbook.Path & _


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


ActiveSheet.Pictures.Insert(ActiveWorkbook.Path & _
strFileName).Select
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
そういうのも考えたんですが、strFileName=j-i と置くと
"(パス名)\j-i.jpg"という感じに読み込まれてしまって上手くいきませんでした。

ハッ

for文の中に
strFileName=j & "-" & i 
と入れれば良かったのか・・・
今気づきました。申し訳ありません。

お礼日時:2011/06/24 21:34

>


これをvbaで記述すると

j & i & ".jpg"

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

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

お礼日時:2011/06/24 21:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!