- ベストアンサー
【マクロ】Excelでコンタクトシートを作成
- Excelを使用してコンタクトシートのような配列で画像を挿入するマクロの作成方法について教えてください。
- 縦5枚×横3枚の配列で画像を挿入する方法がわかりません。どのようにすればよいでしょうか?
- Excelでコンタクトシートのような配列で複数の画像を挿入するマクロを作成したいです。具体的な方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ご提示のコードだと、スタートセル(C4)から順に次のセルを決めて行く方式ですので、わざわざ行・列を計算しなくても、次のセルの位置を指定すればよくなっていますね。 現在のセルに対して次のセルは、基本的には右へ2列なので ActiveCell.Offset(0,2).Select となりますし、もし現在のセルがE列より右なら(折り返すので) ActiveCell.Offset(2,-4).Select みたいになります。 両方を合わせれば If ActiveCell.column>5 then ActiveCell.offset(0,2).select else AitiveCell.Offset(2,-4).select で次のセルが決まるのでは?
その他の回答 (1)
- fujillin
- ベストアンサー率61% (1594/2576)
例えば全体をループで回していると仮定して、i番目の画像をどこに配置するかを対応できれば良いですよね? 質問文に合わせるなら、列はB、D、Fの順(偶数列)、行は1、3、5(奇数行)…が対象となっているとして i のループが1から始まると仮定すれば、i番に対応する行番号、列番号は 行番号 = Int((i - 1) / 3) * 2 + 1 列番号 = ((i - 1) Mod 3 + 1) * 2 で求められますので、そこに貼り付けるようにすればよいのでは? (iのスタートを0からにする方が、対応式は簡単になります) 逆に、行番号、列番号から対応するインデックス番号(=i)を求めるには i = ((rw-1)*3+col)/2 (rw:行番号、col:列番号) となります。 対象となる行や列が違う場合でも、対応関係が規則的なら読み替えの式が作成できるはずですので、このような式を元に対応させてゆくのが簡単化と思います。
お礼
ご回答頂きありがとうございました。 その後いろいろ試行しながら貼り付け先を調整して 無事に解決しました。 ありがとうございました。 (入力欄が前後してしまい申し訳ございません。) ' 次の貼り付け先を選択(アクティブセルにする) Select Case i Mod 3 Case 2 ActiveCell.Offset(0, 2).Select Case 1 ActiveCell.Offset(0, 2).Select Case 0 ActiveCell.Offset(9, -5).Select End Select
補足
ご回答頂きありがとうございました。 大変お恥ずかしい話ですが、ご教授頂いたコードを どの位置に貼り付ければ良いのか検討がつきません。 お手数をお掛けして申し訳ございませんが 下記のコードに当てはめご回答頂ければ頂けれ幸いです。 宜しくお願い申し上げます。 Sub 複数の画像を挿入() Dim strFilter As String Dim Filenames As Variant Dim PIC As Picture ' 「ファイルを開く」ダイアログでファイル名を取得 strFilter = "画像ファイル(*.jpg;*.jpeg;*.gif;*.bmp;*.png),*.jpg;*.jpeg;*.gif;*.bmp;*.png" Filenames = Application.GetOpenFilename( _ FileFilter:=strFilter, _ Title:="図の挿入(複数選択可)", _ MultiSelect:=True) If Not IsArray(Filenames) Then Exit Sub ' ファイル名をソート Call BubbleSort_Str(Filenames, True, vbTextCompare) ' 貼り付け開始セルを選択 'ActicveCellRange("C4").Select ' マクロ実行中の画面描写を停止 Application.ScreenUpdating = False ' 順番に画像を挿入 For i = LBound(Filenames) To UBound(Filenames) Set PIC = ActiveSheet.Pictures.Insert(Filenames(i)) '------------------------------------------------------------- ' 画像の各種プロパティ変更 '------------------------------------------------------------- With PIC .Top = ActiveCell.Top ' 位置:アクティブセルの上側に重ねる .Left = ActiveCell.Left ' 位置:アクティブセルの左側に重ねる .Placement = xlMove ' 移動するがサイズ変更しない .PrintObject = True ' 印刷する End With With PIC.ShapeRange .LockAspectRatio = msoTrue ' 縦横比維持 ' 画像の高さをアクティブセルにあわせる ' 結合セルの場合でも対応 .Height = ActiveCell.MergeArea.Height End With ' 次の貼り付け先を選択(アクティブセルにする)[例:5個下のセル] ActiveCell.Offset(5).Select Set PIC = Nothing Next i ' 終了 Application.ScreenUpdating = True MsgBox i - 1 & "枚の画像を挿入しました", vbInformation End Sub ' バブルソート(文字列) Private Sub BubbleSort_Str( _ ByRef Source As Variant, _ Optional ByVal SortAsc As Boolean = True, _ Optional ByVal Compare As VbCompareMethod = vbTextCompare) If Not IsArray(Source) Then Exit Sub Dim i As Long, j As Long Dim vntTmp As Variant For i = LBound(Source) To UBound(Source) - 1 For j = LBound(Source) To LBound(Source) + UBound(Source) - i - 1 If StrComp(Source(IIf(SortAsc, j, j + 1)), _ Source(IIf(SortAsc, j + 1, j)), Compare) = 1 Then vntTmp = Source(j) Source(j) = Source(j + 1) Source(j + 1) = vntTmp End If Next j Next i End Sub
お礼
補足 【使用環境】 Microsoft Windows XP Professional Microsoft Office Excel 2003 SP3 Microsoft Visual Basic 6.5
補足
ご回答ありがとうございます。 詳しいご回答を頂いたのですが、コードをうまく実行できず 「横3枚」まで行かず、「横2枚」で折り返してしまいます。 何度も申し訳ございませんが、現在は以下のコードとなっていますので 再度ご教授お願い申し上げます。 Sub 複数の画像を挿入() Dim strFilter As String Dim Filenames As Variant Dim PIC As Picture ' 「ファイルを開く」ダイアログでファイル名を取得 strFilter = "画像ファイル(*.jpg;*.jpeg;*.gif;*.bmp;*.png),*.jpg;*.jpeg;*.gif;*.bmp;*.png" Filenames = Application.GetOpenFilename( _ FileFilter:=strFilter, _ Title:="図の挿入(複数選択可)", _ MultiSelect:=True) If Not IsArray(Filenames) Then Exit Sub ' ファイル名をソート Call BubbleSort_Str(Filenames, True, vbTextCompare) ' 貼り付け開始セルを選択 'ActicveCellRange("B4").Select ' マクロ実行中の画面描写を停止 Application.ScreenUpdating = False ' 順番に画像を挿入 For i = LBound(Filenames) To UBound(Filenames) Set PIC = ActiveSheet.Pictures.Insert(Filenames(i)) '------------------------------------------------------------- ' 画像の各種プロパティ変更 '------------------------------------------------------------- With PIC .Top = ActiveCell.Top ' 位置:アクティブセルの上側に重ねる .Left = ActiveCell.Left ' 位置:アクティブセルの左側に重ねる .Placement = xlMove ' 移動するがサイズ変更しない .PrintObject = True ' 印刷する End With With PIC.ShapeRange .LockAspectRatio = msoTrue ' 縦横比維持 ' 画像の高さをアクティブセルにあわせる ' 結合セルの場合でも対応 .Height = ActiveCell.MergeArea.Height End With ' 次の貼り付け先を選択(アクティブセルにする)[例:6個下のセル] Select Case i Mod 2 Case 1 '奇数回目 ActiveCell.Offset(0, 2).Select Case 0 '偶数回目 ActiveCell.Offset(9, -2).Select End Select Set PIC = Nothing Next i ' 終了 Application.ScreenUpdating = True MsgBox i - 1 & "枚の画像を挿入しました", vbInformation End Sub ' バブルソート(文字列) Private Sub BubbleSort_Str( _ ByRef Source As Variant, _ Optional ByVal SortAsc As Boolean = True, _ Optional ByVal Compare As VbCompareMethod = vbTextCompare) If Not IsArray(Source) Then Exit Sub Dim i As Long, j As Long Dim vntTmp As Variant For i = LBound(Source) To UBound(Source) - 1 For j = LBound(Source) To LBound(Source) + UBound(Source) - i - 1 If StrComp(Source(IIf(SortAsc, j, j + 1)), _ Source(IIf(SortAsc, j + 1, j)), Compare) = 1 Then vntTmp = Source(j) Source(j) = Source(j + 1) Source(j + 1) = vntTmp End If Next j Next i End Sub