例えば、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
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
:
という感じ。
いずれにしても、パターンを文字列型変数に設定して
ループカウンタと置き換えてあげれば良いかと思います。
これは凄い。
まさに、パーフェクトな答えです。
知らない関数がいくつか見られたので調べて理解してみようと思います。
ありがとうございました
No.2
- 回答日時:
> ActiveSheet.Pictures.Insert(ActiveWorkbook.Path & _
> j & i & ".jpg").Select
結局のところ、ここのパターンを代えるだけでしょ?
事前に"ファイル名"を生成する部分を追加し、変数に格納(Ex:strFileName)
する(=IFかSelectCase文)しか無いのでは?
ActiveSheet.Pictures.Insert(ActiveWorkbook.Path & _
strFileName).Select
回答ありがとうございます。
そういうのも考えたんですが、strFileName=j-i と置くと
"(パス名)\j-i.jpg"という感じに読み込まれてしまって上手くいきませんでした。
ハッ
for文の中に
strFileName=j & "-" & i
と入れれば良かったのか・・・
今気づきました。申し訳ありません。
No.1
- 回答日時:
>
これをvbaで記述すると
j & i & ".jpg"
となります(1の位と10の位の数字は独立していると考えてください)
何のことだか、わからない。初心者的発想では。
ファイル名は
(1)普通フルで入力させる
(2)文字列的にリストから選択させる
(3)今までにに作ったファイル名もあわせて掲示し、ダイアロウグで表示して入力させる。
などが多い。
ーー
たとえファイル名が2つの意味的な部分に分かれているにしても、2つを分けて入力させて合成などするのは
使う人が困惑するのでは。
文字部+番号部の番号部ぐらいは新しい数字文字を案内することはあっても良いかも。
>、プログラムわからない人には読み込ませることすらできないです
なんていっているが、この質問が、珍奇な発想では。
実際に回りにいる人に実例(コードではない)を示してどれが、素直に判りやすいか聞いてみたら。
こんな質問コーナーに質問するよりよほど大切な態度だと思う。
確かに、自分のやっていることは分かりづらいものでしたね・・・
他人に使わせるとしたら、分かりづらかったです。
素直に、周りの人にどんな感じがいいか聞いてみます。
実際上司にも、連番で入力することは少ないんじゃないかって言われました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) エクセル マクロ(A1:A10)までの中で一番多く出た数字をB10に表示 6 2023/04/25 17:01
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) excel VBA if文について 3 2022/03/27 17:42
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) vbaの計算 if elseと範囲について 6 2022/11/26 01:49
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正負を反転させて出力するプロ...
-
double型が正常に認識されてい...
-
C言語 While文(ループ)内の...
-
数字以外が入力されたらエラー...
-
プログラムC言語の整数の約数に...
-
C言語 逆ピラミッドの作り方
-
2進数の1の数を数える問題
-
4桁の数字以外を入力したらエラ...
-
ダメだ・・・分からない。while...
-
入力値が1以下、かつ数字以外の...
-
VBでの日付入力値のフォーマッ...
-
c言語でひらがなのしりとりをで...
-
scanfが2回使えない・・・?;
-
Eclipseでコマンドラインを入力...
-
プログラム(C)
-
C言語でのカレンダー作成
-
キーボード入力の終了につきま...
-
C言語 for文をつかって記号を表...
-
C言語でつるかめ算をするにはど...
-
プログラミング初心者です。 Py...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
double型が正常に認識されてい...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
C言語scanf_sで何故か2回入力に...
-
if文の条件にscanf関数を使うと…?
-
プログラミングの問題です 「金...
-
Linuxで入力待ちなしkeyread関...
-
ワードで文字を入力する時の変...
-
cout関数を使っているのですが...
-
batプログラム上で文字列を入力...
-
Userformの入力順序をタブオー...
-
scanf が無視されます
-
C言語 逆ピラミッドの作り方
-
gets_sがうまく動かない
-
Excel VBAで、Application.Inpu...
おすすめ情報