Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(macOS 10.xx : Microsoft 365)
複数の画像ファイルを一括で挿入したい
投稿日時: 23/03/07 12:58:45
投稿者: olivia

エクセルに大量の画像を貼り付ける必要があります。
画質は低くサイズも小さいのですが、枚数が多く一枚一枚コピペしていくのが骨です。(300枚以上)
同じ列(例えばA列)に行は一行空白を入れたいので一行おきに(一枚目はA1 二枚目はA3という風に)一括で挿入する方法はあるでしょうか?
ファル名は連番になっているので、その名前の順番でOKです。
 
こちら、マクロ等は使ったことがなく、全くの素人なのですが、解決方法をご教授いただければ幸いです。
どうぞよろしくお願いいたします。

回答
投稿日時: 23/03/07 13:51:36
投稿者: Suzu

コード作成依頼では ないですよね?
 
1セルに1画像を挿入させるVBAは、ネットを探せば検索できると思います。
それを使い、連続セルに画像を挿入。
 
あとは、
1. A列に列を挿入(今までのA列はB列になります)
2. そこに、写真の入っている行まで1からの連番を振る
3. 1からの連番をコピーし、写真の入っている行の次の行へ貼り付け
4. 並べ替えを使い、1〜の順に並べ替えを行えば、1行おきになります
5. A列の連番を削除
 
で良いと思います。

回答
投稿日時: 23/03/07 18:14:14
投稿者: WinArrow

↓に参考になるコードがあります。
 
https://www.moug.net/tech/exvba/0120020.html

投稿日時: 23/03/07 19:14:38
投稿者: olivia

Suzu様
 
ご教授ありがとうございます。
さっそくネット検索で探して近いものを試してみましたが、どうしてもエラーがでてしまい先に進めませんでした。
当方はMacなので、それが原因のような気がしています。
(WindowsとMACでは互換性が厳しいとの記事を見たので、できる範囲で修正を試みましたがだめでした)
もう少し頑張ってみます。
一行あける方法ですが、すみません、よくわかりませんでした。
画像(写真です)が10枚だとして、A1〜A10までを使用。
その横に新たにA列を挿入。写真はB列へ。B1〜B10
A列に連番を振る A1〜10 
>1からの連番をコピーし、写真の入っている行の次の行へ貼り付け
これはB11~20に1〜10のナンバーをコピーでしょうか??
B列を並べ替え(最小から最大) とすると、B1〜10に数字が来て、11〜20に画像、となってしまいます。
理解が弱くてすみません。
間違いを修正していただけると助かります。
 
 
WinArrow様
 
参考アドレスありがとうございます。
こちらをもとにマクロの勉強もしつつ、試してみます。
リンクではなく、直に貼り付けたいと思っています。
 

回答
投稿日時: 23/03/08 15:38:36
投稿者: Suzu

olivia さんの引用:

一行あける方法ですが、すみません、よくわかりませんでした。
画像(写真です)が10枚だとして、A1〜A10までを使用。
その横に新たにA列を挿入。写真はB列へ。B1〜B10
A列に連番を振る A1〜10 
>1からの連番をコピーし、写真の入っている行の次の行へ貼り付け
これはB11~20に1〜10のナンバーをコピーでしょうか??
B列を並べ替え(最小から最大) とすると、B1〜10に数字が来て、11〜20に画像、となってしまいます。

 
 
引用:
3. 1からの連番をコピーし、写真の入っている行の次の行へ貼り付け

こちらの 説明が不明瞭でした。
 

1)A列に 連番を入れる
    A    B
1    1    い
2    2    ろ
3    3    は
4
5
6
7
 
2)A列に入れた連番を連番の直後にコピー
    A    B
1    1    い
2    2    ろ
3    3    は
4    1
5    2
6    3
7
 
3)A列に対し並べ替えを実施
    A    B
1    1    い
2    1
3    2    ろ
4    2
5    3    は
6    3
7
 
上記の流れになります。

回答
投稿日時: 23/03/08 16:14:11
投稿者: Suzu

引用:
さっそくネット検索で探して近いものを試してみましたが、どうしてもエラーがでてしまい先に進めませんでした。
当方はMacなので、それが原因のような気がしています。

 
実際のコードが判りませんし、macのテスト環境も無いので、何とも言えません。
 
 
mac の場合の参考記事
https://the-forme.net/note/spreadsheet/macvbapicture/
https://oshiete.goo.ne.jp/qa/10721136.html
 
2019では安定しないとの記載もありますが
実際の所は判りません。
 
 
Windowsで 当方が使用しているコードを提示しますが、
macではどうなるか判りません。
コードを使用するにあたっては、理解した上で使用してください。
不具合があれば対応しますが、質問者さんの用途に合わせた改造はご自分で行ってください。
 
Sub TEST()
  'ダイアログにて選択した写真を
  ' A2 セルを起点として
  '2行おき、0列おき 列方向に 1枚 挿入し
  '当該セルの大きさいっぱいになる様 アスペクト比を変えずにセルセンターに配置
  '(当該セルが 連結セルであれば、連結されたセルいっぱいに配置)
  Call AddPictures(2, 0, 1)
End Sub

Sub AddPictures(Optional rowOff As Integer = 9, Optional clmOff As Integer = 0, Optional clmCnt As Integer = 1)
'引数
'rowOff :   次の行 までの 行間
'clmOff :   次の列 までの 列間
'clmCnt :   列方向に並べる 数

  Dim wst As Worksheet
  Dim rng As Range

  Dim fName As Variant
  Dim i As Long

  Dim shp As Shape
  Dim img_Rotation As Single
  

  'アクティブシートがワークシート以外(グラフ等)なら 中止
  If TypeName(ActiveSheet) <> "Worksheet" Then Exit Sub

  'ファイル選択
  fName = Application.GetOpenFilename("JPGファイル, *.jpg", MultiSelect:=True)

  'ファイルが選択されなければ中止
  If IsArray(fName) = False Then Exit Sub

  Set wst = ActiveSheet
  wst.Range("A2").Select

  Application.ScreenUpdating = False

  For i = LBound(fName) To UBound(fName)
    '配置するRangeを取得(結合セルなら結合範囲)

    If clmOff = 0 Then
      Set rng = wst.Range("A2").Offset((i - 1) * rowOff, 0).MergeArea
    Else
      Set rng = wst.Range("A2").Offset(Int((i - 1) / clmCnt) * rowOff, ((i - 1) Mod clmCnt) * clmOff).MergeArea
    End If

    Set shp = wst.Shapes.AddPicture( _
          Filename:=fName(i), LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, _
          Left:=rng.Left, Top:=rng.Top, Width:=-1, Height:=-1)

    ImageAdjustRange rng, shp

    Application.StatusBar = "処理中:" & i & "/" & UBound(fName) & "枚目"
  Next i

  With Application
    .StatusBar = False
    .ScreenUpdating = True
  End With

  Set shp = Nothing
  Set rng = Nothing
  Set wst = Nothing

  MsgBox i - 1 & "枚の画像を挿入しました", vbInformation
End Sub

Sub ImageAdjustRange(rng As Range, shp As Shape)
  ' 配置したセルに収まり、センター揃いになる様配置
  Dim sngBackup As Single
  Dim img_Rotation As Single

  With shp
    .LockAspectRatio = msoTrue
    If .Rotation = 90 Or .Rotation = 270 Then
      If .Width / rng.Height < .Height / rng.Width Then
        .Height = rng.Width
      Else
        .Width = rng.Height
      End If
    Else
      If .Height / rng.Height < .Width / rng.Width Then
        .Width = rng.Width
      Else
        .Height = rng.Height
      End If
    End If

    sngBackup = .Width
    img_Rotation = .Rotation

    .Rotation = 0#
    .Top = rng.Top
    .Left = rng.Left
    .LockAspectRatio = msoFalse
  
    .Width = .Height
    .Rotation = img_Rotation
    .Width = sngBackup
    .LockAspectRatio = msoTrue
  
      'Range の センター位置にくる様、画像位置を修正
      If img_Rotation = 90 Or img_Rotation = 270 Then
        If .Top > 0 And rng.Top + (rng.Height - .Width) / 2 + Abs(.Width - .Height) / 2 >= 0 Then
          .Top = rng.Top + (rng.Height - .Width) / 2 + Abs(.Width - .Height) / 2
        End If
        If rng.Left + (rng.Width - .Height) / 2 - Abs(.Width - .Height) / 2 >= 0 Then
          .Left = rng.Left + (rng.Width - .Height) / 2 - Abs(.Width - .Height) / 2
        End If
      Else
        .Top = rng.Top + (rng.Height - .Height) / 2
        .Left = rng.Left + (rng.Width - .Width) / 2
      End If
  End With
End Sub

投稿日時: 23/03/09 12:41:34
投稿者: olivia

Suzu様
 
ご返信ありがとうございます。
 
一行おきの並べ替え:
丁寧な解説でよくわかりました。ありがとうございました。
 
 
コードご提示:
こちらも丁寧な内容でありがとうございます。
じっくり取り組んでみたいと思います。
まずはお礼まで。

投稿日時: 23/03/10 16:50:27
投稿者: olivia

Suzu様
 
自分なりにいろいろと探ってみましたが、諸々の壁にぶつかり、
(Application.GetOpenFilename("JPGファイル, *.jpg", MultiSelect:=True) はMacでは開けない。Apple Scriptを使う手もあるようだが・・・など etc)自分にはハードル高すぎで、ちょっと無理だと判断いたしました。
せっかくご教授いただきましたのに申し訳ありません。
今後はWindows導入も視野に入れようと思います。