NTT-X Store d払いご利用でdポイントが貯まる使える!

こんにちは。VBAマクロを少しかじっています。
顔写真付きの従業員の検索システムを作りました。名前を入力(選択)したら、データシートから職員コード、住所、電話番号などの情報を検索し検索画面に表示します。この際、別のシートに顔写真を貼り付けたもの(1セルに1枚。セルに従業員名を入力してある。)から、VLOOKUP関数を使ってセル照会することで、画像も同時に表示することができます。
別の職員に切り換えたり、クリアする場合の画像の処理は、削除用のシートを用意し、そこにセルごと移動し、終了時にシートごと削除する方法をとりました。(当然、確認用のダイアログボックスが表示されます。)
前置きが長くなりましたが、問題は、用済みの画像を選択するプロシージャがあれば、あえて削除用のシートを用意する必要はありません。セルの場合は、Rangeプロパティやcellsプロパティで特定できますが、画像などのオブジェクトをセル番地などを使って特定する方法ってあるのでしょうか。
因みに、画像の選択処理を、マクロ記録でプロシージャを作成したら、
ActiveSheet.Shapes("Picture 1").Select などとなります。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

検索シートにシェイプが1つしかなければ


ActiveSheet.Shapes(1).Select
で選択
ActiveSheet.Shapes(1).Delete
で削除できます。
    • good
    • 7
この回答へのお礼

ご回答ありがとうございます。
実は、検索シートには、50以上のシェイプを貼り付けています。
Shapesの引数は、""で囲んだオブジェクト名だけとの固定観念を持っていたので、ご教示のような使い方は新たな発見でした。
今後の参考にさせていただきます。
お礼が遅くなって申し訳ありませんでした。

お礼日時:2008/06/04 20:44

A No.2です。


>逆にセル位置から、図形の選択(特定)する方法があれば助かります。
総当たりと記したのは、例えばB3のセルに左上がかかった図形があったとして、全ての図形について検査して、
shp.TopLeftCell.Column = 2 かつ、
shp.TopLeftCell.Row = 3 の時に、
shp.delete すれば良いという事です。
50個以上あるとの事ですので、若干時間がかかるかもしれません。
もう一つ考えられるのは、図形をシート上に設置する際に、選択された状態で、自分の管理し易い名前に付け替えて管理する方法です。
    • good
    • 3
この回答へのお礼

mitarashi様 重ねてのご教授恐れ入ります。
内容は何となく分かりますが、いざ構文となれば、現時点ではgive upです。これからもっと勉強してスキルアップを図っていきたいと思います。お礼が遅くなりましたが、改めて感謝申し上げます。本当にありがとうございました。

お礼日時:2008/06/19 20:23

総当たりで条件に合致するものを見つける方法で良いなら、下記の様に図形の左上がかかるセルの番地等を取得できます。


Sub test()
Dim shp As Shape

For Each shp In ActiveSheet.Shapes
Debug.Print shp.TopLeftCell.Address
Debug.Print shp.TopLeftCell.Column
Debug.Print shp.TopLeftCell.Row
Next
End Sub
    • good
    • 1
この回答へのお礼

早速のご回答ありがとうございます。
質問の仕方が悪かったと反省しています。
逆にセル位置から、図形の選択(特定)する方法があれば助かります。
ご教示いただいたマクロ文は今後の参考にさせていただきます。
お礼が遅くなって申し訳ありませんでした。

お礼日時:2008/06/04 20:39

直接の回答ではありませんが、マクロを使うのではなく、名前定義や図のリンク貼り付けを活用して写真を表示させる方法はいかがでしょうか?


↓のページにその方法についての説明がありますので、ご覧ください。サンプルファイルも置いてあります。

エクセル技道場-数式で図形表示
http://www2.odn.ne.jp/excel/waza/function.html#S …

参考URL:http://www2.odn.ne.jp/excel/waza/function.html#S …
    • good
    • 1
この回答へのお礼

ご教示ありがとうございます。
写真表示はマクロ表示で可能となっており、削除のための図形(写真)を特定する方法がないかというのが、質問の趣旨でした。質問が冗長になってしまって分かりづらかったと思います。
なお、ご紹介いただいたサイトは今後の参考にさせていただきます。
お礼が遅くなって申し訳ありませんでした。

お礼日時:2008/06/04 20:35

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QエクセルVBA 図形の選択法は?

セル範囲をコピー
図としてペースト
ペーストされた図形を選択

記録マクロで書くと下記のようになります。
Sub Macro1()
Range("G2:K15").Select
Selection.Copy
Range("A1").Select
ActiveSheet.Pictures.Paste.Select
ActiveSheet.Shapes.Range(Array("Picture 1")).Select
End Sub

・場所を指定してペーストするのは、事前にselectする必要あるのでしょうか?
・挿入された図の名前がPicture1と分ってないと選択出来ません。他に方法あるのでしょうか?
図は複数あり、たった今ペーストした図形を選択したいのです。

参考になるURLあるいは書籍はないでしょうか?

Aベストアンサー

>挿入された図の名前がPicture1と分ってないと選択出来ません。他に方法あるのでしょうか?

Pasteする際に、Excelが勝手につけた名前を変数に保存して、その名前でSelectすることができます。

名前の保存は、こんな感じで。
MyPicName = ActiveSheet.Pictures.Paste.Name  ’Pasteと同時に、その名前を変数に代入します。

QエクセルVBAで画像を貼り付ける座標設定方法は?

Sheets("Sheet1")に貼り付けたJ-pegの画像(=シンボルマーク)を別なシートに貼り付けるのは下記のVBAで出来ました。ただ、これでは貼り付け先のシートのセルK12が、貼り付け元のK12と同じ位置でないと思った場所に張り付きません。
そこでセルで場所を指定するのではなく、座標のようなもので指定する方法はないものかと考えた次第です。
オートシェイプなどは座標指定で作成できるのですが、J-pegのような画像はどうすればいいのでしょうか?

Sub TEST()
Sheets("FACE").Shapes("シンボルマーク").Copy
ActiveSheet.Range("K12").Select
ActiveSheet.Paste
End Sub

Aベストアンサー

#1です。
>この場合、ファイルをエクセルにくっつけて渡すなんてこと
>はできないものでしょうか?(別々にではなくあくまでエク
>セルのブックに付属した形で)
Excelのブックに付属した形にするなら、コピーペーストする方がいいと思います。一旦挿入した画像を別途保存するのは、簡単には出来ないと思います。

複数のシートで同じような作業をするなら、次のような方法も考えられます。
Function CpyMrk(MrkNM As String, myTop As Single, myLeft As Single)
Sheets("FACE").Shapes(MrkNM).Copy
ActiveSheet.Paste
ActiveSheet.Shapes(MrkNM).Top = myTop
ActiveSheet.Shapes(MrkNM).Left = myLeft
End Function

Sub test()
CpyMrk "シンボルマーク", 10, 10
End Sub

Qエクセルマクロでシート内にある画像のみを選択する

エクセルマクロでシート内にある画像のみを選択する

ActiveSheet.DrawingObjects.Select

これだとエクセルのシート内にあるすべてのオブジェクトを選択してしまいます。
テキストボックスなどのオブジェクトは選択せずに、写真などの画像のみを
選択したいのですがどのようにしたらよいのでしょうか。
どうかよろしくお願いいたします。

Aベストアンサー

ANo1 merlionXXです。
テストした結果、さきほどの回答では画像のほかになぜかOLEObjectまで選択されてしまうことに気づきました。
不思議です。( ̄ロ ̄; ?

訂正します。
ほかにもっと簡単な方法があればわたしも知りたいです。

Sub test02()
  Dim miPc as Picture
  For Each myPc In ActiveSheet.Pictures
    If TypeName(myPc) <> "OLEObject" Then
      myPc.Select False
    End If
  Next
End Sub

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Qエクセルvbaでの図形のカット(コピー)ペーストについて

エクセル2013のVBAで図形をカットして、別の位置に貼り付けるのに、下記のコードで動作させて一応問題なく動作しています。

Sub sample()
ActiveSheet.Shapes("角丸四角形 10").Cut
Cells(1, 1).Select
ActiveSheet.Paste

End Sub

これを、もう少し修正して

ActiveSheet.Shapes("角丸四角形 10").Cut
ActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteAllUsingSourceTheme

このように書くと、
実行時エラー1004
RangeクラスのPasteSpecialメソッドが失敗しました

となり、

ActiveSheet.Shapes("角丸四角形 10").Cut Destination:=ActiveSheet.Range("A1")

このように書くと、
実行時エラー1004
アプリケーション定義またはオブジェクト定義のエラーです

となってしまいました。
図形の貼り付けは一度貼り付け場所をselectしないと貼り付けられないのでしょうか?
またはどのように書けばよいのでしょうか?

エクセル2013のVBAで図形をカットして、別の位置に貼り付けるのに、下記のコードで動作させて一応問題なく動作しています。

Sub sample()
ActiveSheet.Shapes("角丸四角形 10").Cut
Cells(1, 1).Select
ActiveSheet.Paste

End Sub

これを、もう少し修正して

ActiveSheet.Shapes("角丸四角形 10").Cut
ActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteAllUsingSourceTheme

このように書くと、
実行時エラー1004
RangeクラスのPasteSpecialメソッドが失敗しました

となり、

A...続きを読む

Aベストアンサー

こんなんでいかがでしょう。

ActiveSheet.Shapes("角丸四角形 10").Cut
ActiveSheet.Paste Destination:=Range("A1")

ちなみに、"角丸四角形 10" は切り取られて、無くなってしまいます。
ペーストされたものには、別の名前が付きます。

QVBAのロジックでEXCEL上にShape図形があるかないかをチェック

VBAのロジックでEXCEL上にShape図形があるかないかをチェックするには

EXCEL2007-VBAを勉強中です。
EXCELシート上にShape図形があるかないかをチェックするには
どのように書くのでしょうか

どうぞ宜しくお願いします。

Aベストアンサー

図形にはTopLeftCell と BottomRightCell プロパティがあります。
左上隅
MsgBox ActiveSheet.Shapes(1).TopLeftCell.Address
右下隅
MsgBox ActiveSheet.Shapes(1).BottomRightCell.Address


こんな感じでどうでしょうか。

Dim i As Integer

For i = 1 To ActiveSheet.Shapes.Count
If ActiveSheet.Shapes(i).TopLeftCell.Address = "$C$10" Then
MsgBox "セル$C$10に図形を発見しました"
End If
Next i

ちょっとレベルが上がりますが、下記でkeithinさんの回答が参考になります。
エクセルで指定セル範囲内の画像・オートシェイプ・値をマクロを使って削除
http://qa.mapion.co.jp/qa5824633.html


>情報が少なくすみませんでした。
>セル指定を行い、指定したセルにShape図形があるかないかを調べる方法を
少ないというよりも、間違い、レベルだと思いますです。
本文から、捕捉に書かれた、真の意図、を推測することは私には無理です。
アップする前に、意図が第3者に伝わるかどうか、文章を推敲されていますか?
(別に怒っているわけではありませんよ。)

図形にはTopLeftCell と BottomRightCell プロパティがあります。
左上隅
MsgBox ActiveSheet.Shapes(1).TopLeftCell.Address
右下隅
MsgBox ActiveSheet.Shapes(1).BottomRightCell.Address


こんな感じでどうでしょうか。

Dim i As Integer

For i = 1 To ActiveSheet.Shapes.Count
If ActiveSheet.Shapes(i).TopLeftCell.Address = "$C$10" Then
MsgBox "セル$C$10に図形を発見しました"
End If
Next i

ちょっとレベルが上がりますが、下記でkeithinさんの回答...続きを読む

QExcelのマクロを使用してオートシェイプ図形の色を変えたいのです。

Excelのマクロを使用してオートシェイプ図形の色を変えたいのです。

オートシェイプ図形を50個ならべて、マウスでクリックしてものは色が変わるようにしたいと思います。
マクロ記録をすると以下のようになりました。
Sub Macro1()
ActiveSheet.Shapes("AutoShape 1").Select
Selection.ShapeRange.Fill.ForeColor.SchemeColor = 45
Selection.ShapeRange.Fill.Visible = msoTrue
Selection.ShapeRange.Fill.Solid
End Sub

このプログラムを50個書くわけにはいかないのですが、プログラムで処理するのに問題点が2つ出てきました。

・オートシェイプ図形の名前が"AutoShape 1"となっていますが、これを変更したいのですが、書式設定にはありませんでした。変更するにはどうすればよいのでしょう?

・クリックしたオートシェイプ図形がどれであるかを返す関数がないと、どの図形がクリックされたかわからないのですが、これを返す関数はあるのでしょうか?

よろしくお願いします。

Excelのマクロを使用してオートシェイプ図形の色を変えたいのです。

オートシェイプ図形を50個ならべて、マウスでクリックしてものは色が変わるようにしたいと思います。
マクロ記録をすると以下のようになりました。
Sub Macro1()
ActiveSheet.Shapes("AutoShape 1").Select
Selection.ShapeRange.Fill.ForeColor.SchemeColor = 45
Selection.ShapeRange.Fill.Visible = msoTrue
Selection.ShapeRange.Fill.Solid
End Sub

このプログラムを50個書くわけにはいかないのですが、プログラムで...続きを読む

Aベストアンサー

質問者さんが何をなさりたいのかによって、答えが全く変わってきますが (^_^)

50ある図形の一部について色を変えたい、その手間を省きたい
ということなら F4 キーで繰り返し処理ができます。


手間がかかってもよいから、ご質問の通り動くプログラムを作りたい
ということなら、

> オートシェイプ図形の名前が"AutoShape 1"となっていますが、これを変更したい
  Worksheets("シート名").Shapes("シェイプ名").Name = "あなたの好きな名前"

で変えられます。

ちなみにエクセルが自動でつけてくれた名前を知るには

Sub List()
Dim シェイプ As Shape
  For Each シェイプ In Worksheets("Sheet1").Shapes
    Debug.Print シェイプ.TopLeftCell.Address; " "; シェイプ.Name
  Next
End Sub

などとすればよろしいかと思います。こうすればセル位置で確認できます。
なおここで表示される名前は右端に半角空白を一つあけて連番がついているようです。


> ・クリックしたオートシェイプ図形がどれであるかを返す関数
ありません。但し、その関数を自分で作ることはできます。
例えばこんな感じです

Sub Shapeの色を変える()
  With Worksheets("Sheet1").Shapes(Application.Caller)
    .Fill.ForeColor.RGB = RGB(255, 0, 0)
    .Line.ForeColor.RGB = RGB(0, 255, 0)
  End With
End Sub

で、その自作関数を図形にリンクしてやる方法は
  図形を右クリックして 『マクロの登録』 で登録するか
  シェイプ.OnAction プロパティにそのマクロ名を文字列でセットしてやる
試してみましたが、この自作関数はモジュール上に書く必要があるようです。
それと、もちろんですが、50の図形全部についてマクロの登録がひつようです。
マクロを使って登録してもよろしい。
但し、シートにコマンドボタンがあるときは除外しないとエラーになります。

Sub btnShape_Click()
  Dim Shp0 As Shape
  For Each Shp0 In Worksheets("Sheet1").Shapes
    Shp0.OnAction = "Shapeの色を変える"
  Next
End Sub

質問者さんが何をなさりたいのかによって、答えが全く変わってきますが (^_^)

50ある図形の一部について色を変えたい、その手間を省きたい
ということなら F4 キーで繰り返し処理ができます。


手間がかかってもよいから、ご質問の通り動くプログラムを作りたい
ということなら、

> オートシェイプ図形の名前が"AutoShape 1"となっていますが、これを変更したい
  Worksheets("シート名").Shapes("シェイプ名").Name = "あなたの好きな名前"

で変えられます。

ちなみにエクセルが自動でつけてく...続きを読む

QEXCEL VBAで全選択範囲の解除

EXCEL VBAで
Cells.Select
と書くと、全セルが選択状態になりますが、
これを解除するには、どう書けばよいのでしょうか?

Aベストアンサー

その1
A1 など、適当なセルを選択する。
(回答#1と同じ)

その2
全選択する前の選択範囲に戻る。

全選択前に
変数 = Selection.Address で記憶

全選択後
Range(変数).Select で元の選択範囲を選択

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング