Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1892 / 13645 ツリー ←次へ | 前へ→

【71185】データの選択 ぴょんぴょん 12/2/7(火) 9:24 質問[未読]
【71187】Re:データの選択 UO3 12/2/7(火) 11:12 発言[未読]
【71195】Re:データの選択 きょん 12/2/7(火) 22:57 回答[未読]
【71190】Re:データの選択 UO3 12/2/7(火) 15:04 回答[未読]
【71196】ありがとうございます! きょん 12/2/7(火) 23:31 お礼[未読]

【71185】データの選択
質問  ぴょんぴょん  - 12/2/7(火) 9:24 -

引用なし
パスワード
   大変お世話になります.
エクセルに画像ファイル名(100.jpg)等を入力しておき,フォルダにある画像
からその画像を抽出し,エクセル画像名を記載したセルの左のセルへ画像を取り込むマクロをつくりたいです.以下全ての画像を読み込むマクロはできたのですが,画像
の指定がうまくいきません.詳しい方がいらっしゃいましたらご教示よろしくお願い致します.


' 指定したフォルダにある画像ファイルを読み込み、EXCELに貼り付ける。
'
Sub EggFunc_pasteDirImage()

' 変数定義
Dim fileName As String
Dim targetCol As Integer
Dim targetRow As Integer
Dim targetCell As Range
Dim shell, myPath
Dim pos As Integer
Dim extention As String
Dim isImage As Boolean

' 選択セルを取得
targetCol = ActiveCell.Column
targetRow = ActiveCell.Row

' フォルダ選択画面を表示
Set shell = CreateObject("Shell.Application")
Set myPath = shell.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "C:\")
Set shell = Nothing
  
' フォルダを選択したら...
If Not myPath Is Nothing Then
    
fileName = Dir(myPath.Items.Item.Path + "\")
    
Do While fileName <> ""
     
' ファイル拡張子の判別
isImage = True
pos = InStrRev(fileName, ".")
If pos > 0 Then
Select Case LCase(Mid(fileName, pos + 1))
Case "jpeg"
Case "jpg"
Case "gif"
Case Else
isImage = False
End Select
Else
isImage = False
End If
      
' 拡張子が画像であれば
If isImage = True Then
        
' 貼り付け先を選択
Cells(targetRow, targetCol).Select
Set targetCell = ActiveCell
        
' 画像読込み
ActiveSheet.Pictures.Insert(myPath.Items.Item.Path + "\" + fileName).Select
        
' 画像が大きい場合、画像サイズをセル幅に合わせる
If Selection.Width > targetCell.Width Or Selection.Height > targetCell.Height Then
If Selection.Width / targetCell.Width > Selection.Height / targetCell.Height Then
Selection.Height = Selection.Height * (targetCell.Width / Selection.Width)
Selection.Width = targetCell.Width
Else
Selection.Width = Selection.Width * (targetCell.Height / Selection.Height)
Selection.Height = targetCell.Height
End If
End If
               
' 貼り付け先行を+1
targetRow = targetRow + 1
        
End If
fileName = Dir()
    
Loop
    
MsgBox "画像の読込みが終了しました"
 
End If

End Sub

【71187】Re:データの選択
発言  UO3  - 12/2/7(火) 11:12 -

引用なし
パスワード
   ▼ぴょんぴょん さん:

こんにちは
回答ではなく質問です。

>エクセル画像名を記載したセルの左のセルへ画像を取り込むマクロをつくりたいです。
>以下全ての画像を読み込むマクロはできたのですが,画像の指定がうまくいきません.

うまくいかないというのが具体的にどういう状況ですか?
> ActiveSheet.Pictures.Insert(myPath.Items.Item.Path + "\" + fileName).Select
これでエラーになるのですか?
それとも、意図しないものが貼り付けられるのですか?

>エクセル画像名を記載したセルの左のセルへ画像を取り込む

コードを拝見した限りでは、実行時のアクティブセルから下方向に、
無条件にフォルダ内の画像データを貼り付けていますが?

本来は、画像名が記載されたセル領域を特定し、その画像名をトリガーに指定フォルダから
画像データを抽出するのではないですか?
で、そのセル領域は、どこからどこまでといった条件があるのではないですか?

【71190】Re:データの選択
回答  UO3  - 12/2/7(火) 15:04 -

引用なし
パスワード
   ▼ぴょんぴょん さん:

上で質問させていただいているように、要件がクリアには把握できていないのですが
・シートのB列に画像ファイル名(.jpg 等の拡張子なし)が列挙されている。
 (この部分は実際のセル範囲に変更願います)
・そのファイル名を持つ、jpegあるいはjpgあるいはgifデータが指定フォルダにあれば
・そのセルの左のセル(A列)に画像を挿入。
・画像縦横比率を維持してセルにあてはめる部分は、少しすっきり(?)したロジックに。
このような仕様だとしてコードを書いてみました。

Sub Sample()
  Dim c As Range
  Dim myFold As Object
  Dim myPath As String
  Dim myName As String
  Dim ext As Variant
  Dim myPic As String
  Dim r As Range
  
  Set myFold = CreateObject("Shell.Application").BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "C:\")
  If myFold Is Nothing Then Exit Sub
  myPath = myFold.Items.Item.Path
  Set myFold = Nothing
  With ActiveSheet
    For Each c In .Range("B1", .Range("B" & .Rows.Count).End(xlUp))
      If Len(c.Value) > 0 Then
        For Each ext In Array("jpeg", "jpg", "gif")
          myPic = Dir(myPath & "\" & c.Value & "." & ext)
          If Len(myPic) > 0 Then
            c.Offset(, -1).Activate
            With ActiveSheet.Pictures.Insert(myPath & "\" & myPic)
              Set r = .TopLeftCell
              With .ShapeRange
                .LockAspectRatio = msoTrue
                If .Height > r.Height Then .Height = r.Height
                If .Width > r.Width Then .Width = r.Width
              End With
              Set r = Nothing
            End With
            Exit For
          End If
        Next
      End If
    Next
  End With
End Sub

【71195】Re:データの選択
回答  きょん  - 12/2/7(火) 22:57 -

引用なし
パスワード
   ご返信感謝します。ありがとうございます!m(_ _)m以下、わかりにくい内容に
なり、すいません。回答させていただきます。

1.うまくいかないというのが具体的にどういう状況ですか?
画像を全て貼り付けることは出来たのですが、セルに画像ファイル名を
記載し、その画像を横のセルにはりつけるコードが全く思いつかないということです…。

2.ActiveSheet.Pictures.Insert(myPath.Items.Item.Path + "\" + fileName).Select
>これでエラーになるのですか?
>それとも、意図しないものが貼り付けられるのですか?
いえ、エラーにもなりませんし、意図したものが貼り付けられるわけでもないです。
当初の意図とは裏腹に、画像を全てはりつけるマクロしか、私には思いつきません
でした。。

3.コードを拝見した限りでは、実行時のアクティブセルから下方向に、
無条件にフォルダ内の画像データを貼り付けていますが?
本来は、画像名が記載されたセル領域を特定し、その画像名をトリガーに指定フォルダから
画像データを抽出するのではないですか?で、そのセル領域は、どこからどこまでといった条件があるのではないですか?
はい、仰る通りです。実際には、B列に一定の間隔(B2.B4.B6.B8…)で写真名を記載していきたいです。写真は、だいたい50個ほど存在します。かなりコードを修正しないといけませんよね( ; ; )

【71196】ありがとうございます!
お礼  きょん  - 12/2/7(火) 23:31 -

引用なし
パスワード
   本当にありがとうございます!
早速試してみたいと思います。
U03に感謝します、本当にありがとうございます!!
取り急ぎお礼まで♪───O(≧∇≦)O────♪

▼UO3 さん:
>▼ぴょんぴょん さん:
>
>上で質問させていただいているように、要件がクリアには把握できていないのですが
>・シートのB列に画像ファイル名(.jpg 等の拡張子なし)が列挙されている。
> (この部分は実際のセル範囲に変更願います)
>・そのファイル名を持つ、jpegあるいはjpgあるいはgifデータが指定フォルダにあれば
>・そのセルの左のセル(A列)に画像を挿入。
>・画像縦横比率を維持してセルにあてはめる部分は、少しすっきり(?)したロジックに。
>このような仕様だとしてコードを書いてみました。
>
>Sub Sample()
>  Dim c As Range
>  Dim myFold As Object
>  Dim myPath As String
>  Dim myName As String
>  Dim ext As Variant
>  Dim myPic As String
>  Dim r As Range
>  
>  Set myFold = CreateObject("Shell.Application").BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "C:\")
>  If myFold Is Nothing Then Exit Sub
>  myPath = myFold.Items.Item.Path
>  Set myFold = Nothing
>  With ActiveSheet
>    For Each c In .Range("B1", .Range("B" & .Rows.Count).End(xlUp))
>      If Len(c.Value) > 0 Then
>        For Each ext In Array("jpeg", "jpg", "gif")
>          myPic = Dir(myPath & "\" & c.Value & "." & ext)
>          If Len(myPic) > 0 Then
>            c.Offset(, -1).Activate
>            With ActiveSheet.Pictures.Insert(myPath & "\" & myPic)
>              Set r = .TopLeftCell
>              With .ShapeRange
>                .LockAspectRatio = msoTrue
>                If .Height > r.Height Then .Height = r.Height
>                If .Width > r.Width Then .Width = r.Width
>              End With
>              Set r = Nothing
>            End With
>            Exit For
>          End If
>        Next
>      End If
>    Next
>  End With
>End Sub

1892 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free