[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『画像を交互に2種類の指定行へ貼り付けする』(ドナセラ)
お世話になります。
VBA初心者です。
複数の画像をファイル名順に貼り付けしたく、
過去ログを参考にコードを作成しております。
(1)1枚目の画像を貼り付け
(2)2枚目の画像を(1)の3行下のセルに貼り付け
(3)3枚目の画像を(2)の6行下のセルに貼り付け
(4)4枚目の画像を(3)の3行下のセルに貼り付け
 ・
 ・
 ・
といった具合に3行下と6行下への貼り付けを交互に行いたいのですが苦戦しております。
どなたかご教授いただけますでしょうか?
よろしくお願いいたします。
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean)
    Dim fName As Variant
    Dim i As Long
    Dim Pict As Picture
    Dim r As Range
    fName = Application.GetOpenFilename("jpg bmp tif png gif,*.jpg;*.bmp;*.tif;*.png;*.gif", MultiSelect:=True)
    If IsArray(fName) Then
        Application.ScreenUpdating = False
        '配列に格納されたファイル名をソート
        BubbleSort fName, True
            Set r = ActiveCell.MergeArea
    For i = 1 To UBound(fName)
        With ActiveSheet.Shapes.AddPicture( _
                    Filename:=fName(i), _
                    LinkToFile:=False, SaveWithDocument:=True, _
                    Left:=r.Left, Top:=r.Top, _
                    Width:=-1, Height:=-1)
                .Height = 275
                '.Width =
                .Top = r.Top + (r.Height - .Height) / 2
                .Left = r.Left + (r.Width - .Width) / 2
        End With
        Set r = r.Offset(3).MergeArea
    Next i
    End If
    With Application
        .StatusBar = False
        .ScreenUpdating = True
    End With
    Set Pict = Nothing
    If i < 1 Then
    MsgBox "0枚の画像を挿入しました", vbInformation
    Else
    MsgBox i - 1 & "枚の画像を挿入しました", vbInformation
    End If
End Sub
'値の入替え
Public Sub Swap(ByRef Dat1 As Variant, ByRef Dat2 As Variant)
    Dim varBuf As Variant
    varBuf = Dat1
    Dat1 = Dat2
    Dat2 = varBuf
End Sub
'配列のバブルソート
Public Sub BubbleSort(ByRef aryDat As Variant, _
    Optional ByVal SortAsc As Boolean = True)
    Dim i As Long
    Dim j As Long
    For i = LBound(aryDat) To UBound(aryDat) - 1
        For j = LBound(aryDat) To LBound(aryDat) + UBound(aryDat) - i - 1
            If aryDat(IIf(SortAsc, j, j + 1)) > aryDat(IIf(SortAsc, j + 1, j)) Then
                Call Swap(aryDat(j), aryDat(j + 1))
            End If
        Next j
    Next i
End Sub
< 使用 Excel:Office365、使用 OS:Windows10 >
コメントありがとうございます。
説明不足で申し訳ありません。
> i が偶数か奇数かで、3行進めるか、6行進めるかを分岐
の方法が分からず質問させていただいた次第です。
バブルソートは参考にしたコードのまま残しております。
(ドナセラ) 2022/11/25(金) 22:26:42
(確認) 2022/11/25(金) 22:31:54
    If i Mod 2 = 1 Then
        Set r = r.Offset(3).MergeArea
    Else
        Set r = r.Offset(6).MergeArea
    End If
 ということですが、セル結合の状況ではうまくいかないかもしれません。以上。
(確認) 2022/11/25(金) 22:53:12
以下のように、Offsetを使わず、行番号を直接使えば間違いはない。 簡単なモデル例にしています。 参考にしてください。
 Sub test2()
    Dim r As Range, k&, i&
    k = 1
    '最初のセル範囲
    Set r = Cells(k, "A").MergeArea
    For i = 1 To 4
        If i Mod 2 = 1 Then
            k = k + 3
        Else
            k = k + 6
        End If
        '次のセル範囲
        Set r = Cells(k, "A").MergeArea
    Next
 End Sub
(確認) 2022/11/26(土) 05:19:26
ご返信ありがとうございます。
分岐方法をご教授いただき、ありがとうございます。
仕事のデータで手元にないため確認が出来ないのですが、
休み明けに動作の確認をしてみます。
行番号の指定も参考にさせていただきます。
取り急ぎお礼まで…
ありがとうございました。
(ドナセラ) 2022/11/26(土) 09:58:50
教えていただいた分岐方法にて無事解決いたしました。
本当にありがとうございました。
(ドナセラ) 2022/11/28(月) 13:03:25
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
 Modified by kazu.