Excel VBA質問箱 IV

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

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


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

【79902】指定のフォルダから画像を取込むマクロ hiro 18/5/21(月) 22:38 質問[未読]
【79907】Re:指定のフォルダから画像を取込むマクロ γ 18/5/22(火) 20:43 発言[未読]
【79924】Re:指定のフォルダから画像を取込むマクロ γ 18/5/23(水) 23:26 回答[未読]

【79902】指定のフォルダから画像を取込むマクロ
質問  hiro  - 18/5/21(月) 22:38 -

引用なし
パスワード
   ExcelVBA 修行中のものです。お世話になります。
さて、標題のとおり画像を取り組むマクロをネットで拾ってきて、使っているのですが、いまいち理解できない部分がありますので質問させて頂きます。
※マクロ自体は正常に稼働します。

【不明な部分】
fileName = Dir(myPath.Items.Item.Path + "\")

この部分ですが、fileNameには一体、どういったパスが入ることに
なるでしょうか?

ちなみに前段の・・・・
' フォルダ選択画面を表示
Set shell = CreateObject("Shell.Application")
Set myPath = shell.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "C:\")
Set shell = Nothing

では、「C:\画像フォルダ」 を選択しております。


【マクロの全文】

' 指定したフォルダにある画像ファイルを読み込み、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

【79907】Re:指定のフォルダから画像を取込むマクロ
発言  γ  - 18/5/22(火) 20:43 -

引用なし
パスワード
   > fileNameには一体、どういったパスが入ることに なるでしょうか?
結果だけ知りたいのであれば、ステップ実行して、
myPath.Items.Item.Path が何になるのか、
fileName = Dir(myPath.Items.Item.Path + "\")
に何が入るのかは、ご自分で確認できるはずです。
特にこうしたところで質問するまでもないですね。

言ってみれば、これは1つのイディオムみたいなものなので、
そのまま使って便利ですね、で普通は終わりですが、
さらに詳しく知りたいということなら、
Shellオブジェクトをご自分で調べて下さい。
言うまでもなくこれはVBAの外にあるものです。

"Shell.Application" でネット検索して調べてください。

最初にヒットする牟田口さんのサイトの記事
ht tp://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/shellfol.htm
を参考にして下さい。

1つずつ階層を降りていけば、
myPath.Items.Item.Path
の意味が分かると思います。

通常のようにプロパティでつながっていれば、
ローカルウインドウで下に降りていけますが、
この場合は、オブジェクトを返すメソッドで階層を降りていっているので、
ローカルウインドウでは降りていけません。
したがって、ネットでヘルプ・解説記事をよむのが一番です。

この構文の意味がわかっても、それを色々な形で応用するという場面は
さほどないように思いますが、好奇心を満たすことも必要でしょう。

# その構文の意味を知るよりも、インデントを正確につける作法を身につけた方が
# 数倍意味があることだと思います。いかがですか?
# また、文字列の連結は + ではなく、きちんと & を使った方がよいです。

【79924】Re:指定のフォルダから画像を取込むマクロ
回答  γ  - 18/5/23(水) 23:26 -

引用なし
パスワード
   まずは、下記のサイトでデバッグの仕方を勉強されたらいかがでしょうか。
ht tp://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_030.html
ht tp://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_030_03.html

質問してコメントがあったら、とりあえず返事くらいしてください。
最低限のマナーだと思いますよ。

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