
こんにちは。いつも過去ログを大変参考にさせていただいております。
今回も過去Q&Aを探したのですが、何分コーディングの基本を知らずに回答欄のコピペで済ましているため、自分で問題点を見つけることができません。
<質問内容>
Bの列に画像のフルパスを入れてあります。その画像をAの列に自動で表示させるマクロボタンを作りたいのです。B列の2枚目までは上手く写真が表示されます。
しかし、パスが入っていない3列目はC:\NoPicture.jpgを表示させたいのですが、どうしてもそこで止まってしまい、
実行時エラー’1004:’
Picture クラスのInsert プロパティを取得できません。
とういうエラーメッセージが出ます。
正しいコードの書き方をどなたかお教えいただけますでしょうか?
<問題点?>
'r.Item(1).Value = s
With .Pictures.Insert(s).ShapeRange
この辺がうまくいっていないかと・・
<シート内容>
行 列
1 A(画像表示) B(画像のフルパス)
2 C:\teet01.JPG
3 C:\teet02.JPG
4 (空白)
5 C:\teet03.JPG
.
.
20 C:\teet19.JPG
<マクロ文>
Private Sub CommandButton1_Click()
Const n As Long = 2 'margin
Dim r As Range
Dim i As Long
Dim x As Double
Dim s As String
With ActiveSheet
For i = 2 To .Cells(.Rows.Count, 2).End(xlUp).Row '(B)セルは"2", 2行目から順にパスを取得
Set r = .Cells(i, 1).MergeArea '(A)セルは"1"
s = Cells(i, 2).Value
If Dir(s) = "" Then
s = "C:\NoPicture.jpg" '画像が無い場合NoPicture画像を表示
Else
Dir Application.Path
End If
'r.Item(1).Value = s
With .Pictures.Insert(s).ShapeRange
.LockAspectRatio = msoTrue '縦横比固定
x = Application.Min(r.Width / .Width, r.Height / .Height)
If x < 1 Then .Width = .Width * 60 '画像の幅
.Left = r.Left + (r.Width - .Width) / 2 '画像を左右中央に配置
.Top = r.Top + (r.Height - .Height) / 2 '画像を上下中央に配置
End With
Next
End With
Set r = Nothing
End Sub
No.4ベストアンサー
- 回答日時:
またまた登場、myRangeです。
>顧客が「どうしてもエクセルでデータを欲しい」と言うことなので
>恥ずかしながらお伺いしている次第です
質問することはなーんも恥ずかしいことではありませぬよ。
ただ、得た知識は必ずや自分のものにする、
という心意気が必須であることは言わずもがなのことですが。。。
では、本題。
CommandButtonのあるシートで実行するので、
かつ、画像はそのままでセルに嵌るということなので
より簡潔なコードにしてあります。
'----------------------------------------
Private Sub CommandButton1_Click()
Dim R As Long
Dim myPic As String
Dim myCell As Range
For R = 2 To Cells(Rows.Count, 2).End(xlUp).Row
Set myCell = Cells(R, 1)
myPic = Cells(R, 2).Value
If myPic = "" Or Dir(myPic) = "" Then
myPic = "C:\aaa\NoPicture.jpg"
End If
With ActiveSheet.Pictures.Insert(myPic).ShapeRange
.Top = myCell.Top + (myCell.Height - .Height) / 2
.Left = myCell.Left + (myCell.Width - .Width) / 2
End With
Next
End Sub
'-------------------------------------
なお、明日、明後日と福岡への旅。
よってこれについての再質問は、今夜23時30分までに願います。
それか、月曜日に。。。
以上です。
myRangeさん!
23:26分です!
出来ました~!ありがとうございます!完璧です!
博多ですか?
明太子、歌舞伎・・良いですね~
楽しんで行ってきてください。気をつけて!
本当にありがとうございました。
>質問することはなーんも恥ずかしいことではありませぬよ。
>ただ、得た知識は必ずや自分のものにする、
>という心意気が必須であることは言わずもがなのことですが。。。
はい、これからも頑張ります!また何かあったらよろしくお願いします。
No.3
- 回答日時:
>その消していたものが巨大なNoPictureでした。
当方が、質問者のコードが、ん? と言ったのはそこらあたりも含まれています。
巨大の原因は、
If x < 1 Then .Width = .Width * 60 '画像の幅
これです。
画像の高さ、幅、どちらかが、または、どちらも、セルの高さ、幅より大きかったら、
画像の幅を60倍してますよね?
わぁーーー、巨大!(^^;;;
それを含めおかしいと思われる部分など修正したのが下記のコードです。
'----------------------------------------
Private Sub CommandButton1_Click()
Const n As Long = 2 '●もともと未使用
Dim r As Range
Dim i As Long
Dim x As Double '●今回は使用しない
Dim s As String
With ActiveSheet
For i = 2 To .Cells(.Rows.Count, 2).End(xlUp).Row
Set r = .Cells(i, 1)
s = .Cells(i, 2).Value
If Dir(s) = "" Then s = "C:\aaa\NoPicture.jpg"
With .Pictures.Insert(s).ShapeRange
Range("D1") = .Width / .Height
.LockAspectRatio = msoTrue
If .Width >= r.Width Then .Width = r.Width * 0.9
If .Height >= r.Height Then .Height = r.Height * 0.9
.Left = r.Left + (r.Width - .Width) / 2
.Top = r.Top + (r.Height - .Height) / 2
End With
Next
End With
End Sub
'------------------------------
画像の高さ、幅がセルのそれより大きかった場合は、セルの90%にしてあります。
それから、質問提示のコードで、
Set r = .Cells(i, 1).MergeArea と、MergeAreaを使ってますが、
もし結合セルを扱うのであればコードが違ってくることは言うまでもありません。
それと画像全部を無条件にセルの90%にするとかは拙いのでしょうか?
以上です。
この回答への補足
myRange 様
先程のお礼に追加させていただきます。
>Set r = .Cells(i, 1).MergeArea と、MergeAreaを使ってますが、
>もし結合セルを扱うのであればコードが違ってくることは言うまでも>ありません。
結合セルは扱っておりません。
今回の格闘の理由は、MsAccessで商品仕様書管理をしておりまして、顧客が「どうしてもエクセルでデータを欲しい」と言うことなので、恥ずかしながらお伺いしている次第です。OLE画像もテキストと一緒にExcelに貼りつけばこんな苦労しなくて済むのですが・・
>それと画像全部を無条件にセルの90%にするとかは拙いのでしょう>か?
ご心配ありがとうございます。
貯めてある画像は、エクセルに貼り付け用にすべて約W60mmxH30mmに統一してありますので、1倍で大丈夫かと存じます。
以上のとおりよろしくお願い申し上げます。
myRange 様
本当にご教授ありがとうございます!
>巨大の原因は、
> If x < 1 Then .Width = .Width * 60 '画像の幅
>これです。
>画像の幅を60倍してますよね?
ご指摘の通りですね。60mmのつもりでした。お恥ずかしい・・
早速修正していただいたコードでトライしてみましたところ、
まだ、NOPicture.jpgが入らず、
With .Pictures.Insert(s).ShapeRange
の位置でデバック?止まってしまいました。
ちなみにご教授いただいた確認方法、コードから直接コピペでB列任意の場所にNoPicture.jpgのパスを入れると,NoPictureを含めて最後の行までちゃんと画像が表示されます。ただその時は(D1)セルになぜか数値1.71969699859619 が入りました。計算結果のような・・
Range("D1") = .Width / .Height
とは、写真の大きさを(D1)セルに合わせるというコードという解釈でよろしいでしょうか?
以上のとおりよろしくお願い申し上げます。
No.2
- 回答日時:
回答1、myRangeです。
質問者のコードはコード的には、ん? という部分もありますが、
そのままでもエラーは出ずに動作するコードです。
で、NoPicture.jpgないのでは?、との回答になりました。
目視での確認では間違いない、ということですから
再確認のため下記を試してみてください、間違いなく存在が確認できますので。
B列の任意のセル(B2が直ぐ確認できる)に
問題の画像のフルパス、"C:\NoPicture.jpg" を入力してマクロを実行する。
存在すれば表示されるはずですよね。
但し、画像のフルパス、C:\NoPicture.jpg は
手入力ではなく、現在のマクロからセルにコピペすること。
以上です。
この回答への補足
myRange 様
>但し、画像のフルパス、C:\NoPicture.jpg は
>手入力ではなく、現在のマクロからセルにコピペすること。
>以上です。
結果の報告が遅れ申し訳ありません。
上記の方法、また名前を変えたり保存場所を変えたりしていても上手く行きませんでしたが、格闘している間に気づきました。
「NoPictureだけ表示しない」のではなく、「巨大に貼りつく(100倍ぐらい?)」ということです。
実はマクロの終了の仕方もおかしかったのです。
マクロが終了後、他のセルの文字が見えないのでデリートキーで消していました。その消していたものが巨大なNoPictureでした。
つまりNoPictureを張付るコードのところだけ、画像の大きさ指示が抜けているようです。
ご教授いただければ幸いです。
myRange 様
ご返信ありがとうございます。
明日早速会社でご指示通り確かめてみます。
>質問者のコードはコード的には、ん? という部分もありますが、
>そのままでもエラーは出ずに動作するコードです。
>で、NoPicture.jpgないのでは?、との回答になりました。
コード的には間違っていないとのご指摘ありがとうございます。
このサイト等から見よう見まねで作ったもので・・
もし他の作り方があるようでしたらお教えいただければ大変助かります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELで特定のセルに表示...
-
マクロでオートシェイプを表示...
-
クリックすると文章が表示され...
-
Excel2007 色のカウント (VBA)
-
太字に設定されているセルの個...
-
GET.CELL関数を使ったら、警告...
-
エクセル 数字をすべて○などの...
-
[EXCEL] フォント変更が正常に...
-
エクセルに書き込みのHPについて
-
Excel内での検索結果をシート...
-
エクセルのマクロで図形の挿入...
-
【Excel】桁数チェックおよび修正
-
エクセルでのコピーペースト
-
Excel2013、ワークシート内に検...
-
エクセルのある項目に記述され...
-
マクロで列を非表示の件
-
配列の絶対値の平均値の求め方
-
現在のセルの位置を返す関数は...
-
セルがWクリックされたら、別...
-
Excel 加算数値の個数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELで特定のセルに表示...
-
Excel内での検索結果をシート...
-
エクセル 数字をすべて○などの...
-
クリックすると文章が表示され...
-
Excelで、図形内の文字をセルに...
-
Excelでセルをクリックす...
-
Excel ハイパーリンクのURLを別...
-
太字に設定されているセルの個...
-
マクロを実行すると画像がズレ...
-
セルの内容をテキストボックス...
-
フォントの色を指定して削除出...
-
Excel:セルの値(文字列)を数...
-
Excel2007 色のカウント (VBA)
-
エクセルでPDFリンクを大量...
-
アポストロフィーの一括挿入 ...
-
現在のセルの位置を返す関数は...
-
エクセルでセルをダブルクリッ...
-
空白セルを空セルに置き換える...
-
エクセル シート保護された共...
-
エクセル 未入力セルがあると...
おすすめ情報