Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 7 Professional : Excel 2007)
画像の呼び出し
投稿日時: 18/03/07 12:57:53
投稿者: コウキ 大平

画像のリンクのがAU列に貼られている一覧表から、検索をかけて呼び出すマクロがあるのですが、画像のファイルが見つからないとエラーが出ます。
これを、画像のリンクが見つからない時はMagBoxで画像はありませんと表示させたいのですができますでしょうか?
そのマクロは以下の様になっいます。
 
Private Sub 読込ボタン_Click()
 
 
     Dim myRng As Range, sn As Variant
     For Each sn In Array("F6一覧表", "F7一覧表", "F8一覧表", "起重機一覧表", "その他一覧表")
         Set myRng = Sheets(sn).Columns(3).Find(What:=Me.TextBox1.Value, LookIn:=xlValues, LookAt:=xlWhole)
         If Not myRng Is Nothing Then
         If myRng.Offset(0, 1).Value = "" Then
           MsgBox "データがありません。", vbExclamation, "NotFound"
            Exit Sub
            End If
            Set sh = Worksheets(sn)
      Me.Image1.Picture = LoadPicture(Sheets(sn).Cells(myRng.Row, "AU").Value)
 
よろしくお願いします。

回答
投稿日時: 18/03/07 14:36:35
投稿者: WinArrow
投稿者のウェブサイトに移動

簡単な対応策
 
DIR関数を使う方法
 

If Dir(ファイルのフルパス) = "" Then
 'ファイルが存在しない時の処理
Else
 'ファイルが存在する時の処理
End If

投稿日時: 18/03/07 14:57:27
投稿者: コウキ 大平

ファイルのフルパスは毎回検索して違うのですがどうすればいいでしょうか?

投稿日時: 18/03/07 14:57:43
投稿者: コウキ 大平

ファイルのフルパスは毎回検索して違うのですがどうすればいいでしょうか?

回答
投稿日時: 18/03/07 15:00:33
投稿者: WinArrow
投稿者のウェブサイトに移動

コウキ 大平 さんの引用:
ファイルのフルパスは毎回検索して違うのですがどうすればいいでしょうか?

>Sheets(sn).Cells(myRng.Row, "AU").Value
 
これは、フルパスではないのでしょうか?

投稿日時: 18/03/07 15:10:06
投稿者: コウキ 大平

これをそのまましようすればよいということですか?
 
これは、一覧表から呼び出すマクロですが、これをフルパスとしてよいのですか?

回答
投稿日時: 18/03/07 15:42:20
投稿者: WinArrow
投稿者のウェブサイトに移動

コウキ 大平 さんの引用:
これをそのまましようすればよいということですか?
 
これは、一覧表から呼び出すマクロですが、これをフルパスとしてよいのですか?

 
試してみれば?
 
若し、""が返るようならば、そのものがフルパスになっていないのです新
 
LoadPictureもだめですよね?

投稿日時: 18/03/07 15:49:55
投稿者: コウキ 大平

試してみたらコンパイルエラーがでます。

回答
投稿日時: 18/03/07 16:20:12
投稿者: WinArrow
投稿者のウェブサイトに移動

コウキ 大平 さんの引用:
試してみたらコンパイルエラーがでます。

 
回答者は、あなたのPCの画面は見えません。
どのようなコードでどこでエラーになったか説明しましょう。

回答
投稿日時: 18/03/07 23:46:43
投稿者: もこな2

とりあえず、変な空白行があったり、インデント位置がバラバラで読みづらいので整理してみました。
 

引用:
Private Sub 読込ボタン_Click()
'==変数の宣言とか
   Dim myRng As Range, sn As Variant
    
'==処理
   For Each sn In Array("F6一覧表", "F7一覧表", "F8一覧表", "起重機一覧表", "その他一覧表")
       
      Set myRng = Sheets(sn).Columns(3).Find _
         (What:=Me.TextBox1.Value, LookIn:=xlValues, LookAt:=xlWhole)
       
      If Not myRng Is Nothing Then
         If myRng.Offset(0, 1).Value = "" Then
            MsgBox "データがありません。", vbExclamation, "NotFound"
            Exit Sub
         End If
       
         Set sh = Worksheets(sn)
         Me.Image1.Picture = LoadPicture(Sheets(sn).Cells(myRng.Row, "AU").Value)
      End If
   Next sn
End Sub
↑赤字は、コピペミスと解釈して足してあります。
 
そして、ご質問の
コウキ 大平 さんの引用:
これを、画像のリンクが見つからない時はMagBoxで画像はありませんと表示させたいのですができますでしょうか?
についてですが、質問の意味がよくわかりませんが、("F6一覧表", "F7一覧表", "F8一覧表", "起重機一覧表", "その他一覧表")いずれのシートでもFindメソッドでNothingが返る場合はメッセージを表示させたいってことでしょうか?
 
そうであれば、
Private Sub 読込ボタン_Click()
'==変数の宣言とか
   Dim myRng As Range
   Dim MySH As Worksheet
   
'==処理
   For Each MySH In ThisWorkbook.Worksheets(Array("F6一覧表", "F7一覧表", "F8一覧表", "起重機一覧表", "その他一覧表"))
      
      'Findメソッドで「MySH」の「C列」に「Me.TextBox1.Value」に一致するものがないか探す
      Set myRng = MySH.Columns(3).Find _
         (What:=Me.TextBox1.Value, LookIn:=xlValues, LookAt:=xlWhole)
      
      'Findメソッドで無事に見つかったらForを抜ける
      '(このとき「MySH」には見つかったシートがセットされている)
      If Not myRng Is Nothing Then Exit For
      
   Next MySH
   
   '「myRng」がNothing、つまり一度も見つかってないのであれば、メッセージを表示
   If myRng Is Nothing Then
      MsgBox "各シートを検索した結果、" & Me.TextBox1.Value & "は、見つかりませんでした"
   Else
      If myRng.Offset(0, 1).Value = "" Then
         MsgBox _
            MySH.Name & "の" & myRng.Row & "行目にて" & Me.TextBox1.Value & "を発見" & vbCrLf & _
            "しかし、データがありません。", vbExclamation, "NotFound"
         Exit Sub
      End If

      '無事に、Findメソッドで対象セルが見つかって、その右側のセルがブランクでなければ、以下を実行
      Me.Image1.Picture = LoadPicture(MySH.Cells(myRng.Row, "AU").Value)
   End If

End Sub
こんな感じに修正してみてはいかがでしょうか?

回答
投稿日時: 18/03/08 00:40:31
投稿者: もこな2

先ほど投稿したコードに一部誤りがあったので修正。
ついでにちょこっと改修。
 

引用:
Private Sub 読込ボタン_Click()
'==変数の宣言とか
   Dim myRng As Range
   Dim MySH As Worksheet
    
'==処理
   For Each MySH In ThisWorkbook.Worksheets(Array("F6一覧表", "F7一覧表", "F8一覧表", "起重機一覧表", "その他一覧表"))
       
      'Findメソッドで「MySH」の「C列」に「Me.TextBox1.Value」に一致するものがないか探す
      Set myRng = MySH.Columns(3).Find _
         (What:=Me.TextBox1.Value, LookIn:=xlValues, LookAt:=xlWhole)
       
      'Findメソッドで無事に見つかったらForを抜ける
      '(このとき「Mysh」には見つかったシートがセットされている)
      If Not myRng Is Nothing Then Exit For
       
   Next MySH
    
   '「myRng」がNothing、つまり一度も見つかってないのであれば、メッセージを表示
   If myRng Is Nothing Then
      MsgBox _
         "各シートを検索した結果、" & Me.TextBox1.Value & _
         "は、見つかりませんでした"
      Exit Sub
   End If
    
   '「myRng」の「Offset(0, 1)」がブランクであるか否かで処理分岐
   If myRng.Offset(0, 1).Value = "" Then
      'Findメソッドは成功したが、右セルがブランクであった場合
      MsgBox _
         MySH.Name & "の" & myRng.Row & "行目にて" & _
         Me.TextBox1.Value & "を発見" & vbCrLf & _
         "しかし、データがありません。", vbExclamation, "NotFound"
   Else '← 先ほどの投稿ではココを間違っている
      'Findメソッドが成功し、かつ、右セルがブランクでなかった場合
      Me.Image1.Picture = LoadPicture(MySH.Cells(myRng.Row, "AU").Value)
   End If
 
End Sub

回答
投稿日時: 18/03/08 16:32:29
投稿者: WinArrow
投稿者のウェブサイトに移動

最初から、説明を読み直して、
 質問します。
 

引用:

コウキ 大平 さんの引用:
 
画像のリンクのがAU列に貼られている一覧表から、検索をかけて呼び出すマクロがあるのですが、画像のファイルが見つからないとエラーが出ます。
これを、画像のリンクが見つからない時はMagBoxで画像はありませんと表示させたいのですができますでしょうか?

 
この説明の解釈は、2通りあると思います。
(1)Findメソッドで見つからない
(2)LoadPictureで見つからない
 
前者は、もこな2さんの解釈です。
  →もこな2さんのレスを参考に!
後者は、私の解釈です。以下を参考に
 
 ほとんど、意図したとおり動作しているが、
 画像ファイルが見つからないことがある
 ・・・つまり、AU列セルの「値」(画像ファイルへのリンク文字列)に問題があると
LoadPictureに与える引数(AU列セルの「値」)が画像ファイルのフルパスであると
考え、「Dir関数にAU列セルの「値」を指定して、チェックをしたら」という提案をしました。
 
再度確認します。
 
質問1
>画像のリンクのがAU列に貼られている
 このAU列セルには、画像ファイルのフルパスが入っていると考えてよいのでしょうか?
  
質問2
このリンクとは、ハイパーリンクのことですか?
とすると、 AU列セルに設定してあるハイパーリンクの「Address」を指定する必要があるのではないでしょうか?
 
  

トピックに返信