• ベストアンサー

【エクセルマクロ】ユーザーフォームの画像をコピー?

ユーザーフォームにある画像を、 クリックしたら、クリップボードにコピーするにはどうしたらいいですか? コピーのメソッドはないようで、 下記はエラーになります。 Private Sub Image1_Click() Me.Image1.Picture.Copy End Sub

noname#221405
noname#221405

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

No.1お礼欄への返信です。 > アウトルックに貼り付けて ... メール送信ということをしたいのです > ... 一番早いのはクリップボードかなあ、と ... HTML形式のメールであれば、画質はともかく、No.1の方法からでも図としての貼付けは出来ますね。 添付ファイルとして送るとかなら、クリップボードに画像ファイルのパスを送っておけば、 メール作成画面で、[ファイルの添付]で表示される[ファイルの挿入]ダイアログにて、 そのままCtrl+Vを押せば、[ファイル名]欄に対象の画像のパスが表示されるので、 [挿入]ボタンを押すとか。 要は文字列としてのファイルパス(aryPict(i))をコピーした状態を作るという感じ。 原本を送ることにはなりますが、メールですから原画質で送受信されるかは環境次第です。 ' ' /// ' ' Image1を右クリックしたら ' ' 現在表示中の画像(aryPict(i))のファイルパスを ' ' クリップボードに送る Private Sub Image1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Dim oDTO As New MSForms.DataObject  ' ' Image1を右クリックしたら   If Button = 2 Then    ' ' Image1に現在表示中の画像(aryPict(i))のファイルパスをクリップボードに     With oDTO       .Clear       .SetText aryPict(i), 1       .PutInClipboard     End With   End If End Sub ' ' /// No.1の回答趣旨に副えば、ExcelからOutlook VBAを操作する、 ということになりますが、複数の写真を貼ることもあるのでしょうし、 セキュリティ的な面からみても、メール作成は手作業の方が 自分で作成内容が解って良いかもですね。 VBAで操作出来なくもないですけれど、 殆どの作業が自分好みのメール作成の仕方みたいな感じなので、 こちらからレクチャーするものでもないのかな、と。 Outlook VBAは長いこと触っていない私だったりもしますが、それは置いても、 このケースはクリップボードの方が扱い易くて安心なのだと思います。 話を整理しますと、 HTML形式のメールに図として貼付ける場合は、今質問への回答No.1の2つ目のやり方で、 添付ファイルとして送る場合は、この回答に書いたやり方で、 ということになります。 念の為ですが、前回の回答No.1で >> ※ 一応、LoadPictureした後は、Me.Repaint、した方が無難かと。 と書いていましたが、クリップボードを扱う関係で必須になります。   Me.Image1.Picture = LoadPicture(aryPict(i)) の次の行に   Me.Repaint をお忘れなく。 それから、今質問への回答No.1のように画像(図)をコピーした場合は、 クリップボードに連続してコピー→貼付けすることが出来るのですが、 クリップボード画面にすべての画像のプレビューが表示されないかも知れませんが、 (プレビューはありません)と表示されていれば、貼付けは出来ますので。 以上になります。

noname#221405
質問者

お礼

ありがとうございます! 選択範囲をメールに貼り付け送るというマクロも 書いて試してみたのですが、 実際運営していると 一枚や二枚になったり、送り先がそのつど変わったりとするので 手動で送るほうが便利かなあと思ってます。 本当に助かりました。ありがとうございます!!!!

その他の回答 (3)

回答No.4

一応、やり方が選べるように、例として、  Image1 を 右Click して写真を(複数)選択しておいて、  CommandButton3 を Click すると、  Outlook の メール作成画面が開いて、  選択していた写真を添付ファイルに自動指定する  (その他諸々) のコードを参考までに挙げておきます。 例えばセキュリティの問題でOutlook側で受け付けて貰えない可能性もありますし、 何れにしてもお好みの形にカスタマイズする必要はあるでしょうけれど、 取っ掛かり、ぐらいにはなるのかなぁ?と。 参考ページ。 三流君VBA > Outlookでファイルを添付するには?.Attachments.Add http://www.ken3.org/vba/backno/vba078.html ' ' UserFormモジュール先頭、宣言部 Dim colAttPict As Collection ' 選択した写真のパスを格納するコレクションオブジェクト Private Sub CommandButton3_Click() Const olMailItem = 0 Dim olApp As Object ' Outlookアプリケーション Dim v   If colAttPict Is Nothing Then MsgBox "写真未選択": Exit Sub   Set olApp = CreateObject("Outlook.Application") ' Outlookアプリケーションオブジェクトの生成   With olApp.CreateItem(olMailItem) ' メールオブジェクト     For Each v In colAttPict ' 選択した写真のパスをコレクションオブジェクトで総当たり       .Attachments.Add v ' 選択した写真のパスをメールの添付ファイルに指定     Next     Set colAttPict = Nothing ' コレクションオブジェクト解放     .To = "xxxx@xxx.co.jp" ' メール宛先     .CC = "yyyy@xxx.co.jp" ' 〃     .Subject = "画像添付テスト" ' メールタイトル     ' ' メール本文     .Body = "こんにちは" & vbCrLf _         & "画像添付のテストです。" & vbCrLf _         & "如何でしょう?"     olApp.GetNameSpace("MAPI").GetDefaultFolder(6).Display ' Outlookアプリケーション表示     .Display ' メール編集画面の表示   End With   Set olApp = Nothing End Sub Private Sub Image1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)   If Button = 2 Then ' Image1を右クリックしたら     If colAttPict Is Nothing Then Set colAttPict = New Collection ' コレクションオブジェクトが未生成なら生成     colAttPict.Add aryPict(i), CStr(i) ' 選択した写真のパスをコレクションオブジェクトに追加   End If End Sub

回答No.2

回答No.1です。 失礼しました。編集漏れがありまして、 >  If Button = fmButtonRight Then  fmButtonRight はTypeが未定義のまま掲載していますので、 1つめのコードはエラーになります。 2つめのコードに合わせて、   If Button = 2 Then に差し替えてください。 尚、こちらからの例示は、 > Image1を右クリックしたらば というものですが、  左クリックなら   If Button = 1 Then  右クリックなら   If Button = 2 Then  中(ホイールボタン等)クリックなら   If Button = 4 Then という風に、お求めの仕様に合わせて替えてください、 という主旨で書いていたものです。 以上、訂正でした。

回答No.1

こんにちは。 【エクセルマクロVBA】写真のスライドショーしたい http://okwave.jp/qa/q9163937.html でも回答しました。 > ユーザーフォームにある画像を、 > クリックしたら、クリップボードにコピーするにはどうしたらいいですか?  コピー  貼付け 2工程分ける必要があるかどうかまずは確認が必要ですね。 画質の劣化を防ぐ意味でも、コピーではなくて、 直接画像ソースを取り込む方が有利な気がします。 問題は貼付け先ですね。 VBAで送れる相手なら直接画像を読み込ませて表示させればいいのでしょうし、 クリップボードを経由することが本当に必要なのか、ということで 設計は変わってくるのだと思います。 さしあたり、前回のNo.1お礼欄のコードが原型を留めているのでしたら、 大元の画像ファイルのパスが取得済ですから、 ワークシートに対してはあっさりと処理できます。 ' ' /// ' ' Image1を右クリックしたらば、 ' ' 現在表示中の画像をアクティブシート(アクティブセルを左上にして)に挿入する Private Sub Image1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)  ' ' Image1を右クリックしたら[fmButtonLeft | fmButtonRight | fmButtonMiddle]   If Button = fmButtonRight Then     ' ' Image1に現在表示中の画像(aryPict(i))をアクティブセルに挿入する     ActiveSheet.Pictures.Insert aryPict(i)   End If End Sub ' ' /// > クリップボードにコピーする という目的で考えても、 上記の簡単なマクロで一旦シート上に挿入したものを切り取る、 という手順が簡単でいいかなぁと。 ' ' /// 簡易版 ' ' Image1を右クリックしたらば、 ' ' 現在表示中の画像をアクティブシート(アクティブセルを左上にして)に挿入し ' ' 挿入した画像を切り取って、クリップボードに送る Private Sub Image1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)  ' ' Image1を右クリックしたら[1 = fmButtonLeft | 2 = fmButtonRight | 4 = fmButtonMiddle]   If Button = 2 Then    ' ' Image1に現在表示中の画像(aryPict(i))をアクティブセルに挿入し切り取る     ActiveSheet.Pictures.Insert(aryPict(i)).Cut   End If End Sub ' ' /// シートに画像は残りませんし、そのまま外部アプリケーションに貼り付けも可能です。 難を云えば、 アクティブシートが[シートの保護]を適用している場合のケアとか、 保存済のブックが未保存になるとか、 まぁ必要なら対応は簡単に出来るでしょうけれど。 後は貼り付け先で要求される画質ですね。 エクセルシートで読み込む方法も数通りありますが、 [図の挿入]レベルで良ければ問題になりませんし、 元の写真の画質を忠実に再現するのならば、やはり、 コピーせずに、直接読み込ませる方が合理的かと。 ご要望に適わない点がありましたら 「コピーした後どうしたいのか」について補足をお願いします。

noname#221405
質問者

お礼

ありがとうございます!!!! おかげさまで、前回助けて頂いたスライドショーがとても役立っています。 毎日大体100の写真がアップされ、写真の名前によって分けて表示するコードを追加しました。それでまあ20枚から25枚、一個つづ見てくんですが、気になる写真、例えばチームメンバーに「はあ、これ、どうなってるのよ!!!??」と聞かなきゃいけない写真が1枚か2枚出てきます。それを右クリックで、アウトルックに貼り付けてチームメンバーにメール送信ということをしたいのです・・・だから、一番早いのはクリップボードかなあ、と思い質問しました。アドバイスを頂けましたら幸いです。

関連するQ&A

  • エクセルのユーザーフォームでご教授ください

    マクロの知識はほぼなく、調べながらエクセルの入力用のユーザーフォームを作りましたが、うまく作動しません。 UserForm1 ~~~~~~~~~~~~~~~~~~~~~~~~~ Option Explicit Private Declare Function ReleaseCapture Lib "user32" _ () As Long Private Sub UserForm_Initialize() Me.Show End Sub Private Sub Button_cxl_Click() Me.Hide End Sub Private Sub ok_Click() Dim RowNum As Long Dim Ctrl As Control RowNum = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(RowNum, 1).Value = Me.txt_date Cells(RowNum, 2).Value = Me.txt_guest Cells(RowNum, 3).Value = Me.txt_person Cells(RowNum, 4).Value = Me.txt_begin Cells(RowNum, 5).Value = Me.txt_finish For Each Ctrl In Me.Controls If Ctrl.Name Like "txt*" Then Ctrl.Value = "" RowNum = 0 End If Next Ctrl Me.Hide ReleaseCapture UserForm2.Show vbModal End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~ UserForm2 ~~~~~~~~~~~~~~~~~~~~~~~~~ Option Explicit Private Declare Function ReleaseCapture Lib "user32" _ () As Long Private Sub UserForm_Initialize() End Sub Private Sub ButtonEnd_Click() Unload Me UserForm1.Hide End Sub Private Sub ButtonNext_Click() Unload Me ReleaseCapture UserForm1.Show vbModal End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~ Module1 ~~~~~~~~~~~~~~~~~~~~~~~~~ Sub ユーザーフォーム() UserForm1.Show End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~ UserForm1を開き、Button_cxlで閉じず、もう一度Button_cxlをクリックで閉じる。 UserForm1を開き、Button_okでUserForm2を出し、ButtonEndをクリックでUserForm1にもどる(1と2を数度行き来しても同じ) UserForm1を開き、Button_okでUserForm2を出しButtonNextをクリックでUserForm1にもどりButton_cxlをクリックで閉じず、もう一度クリックしても閉じず、三回目で閉じる。 現状、エクセルを開いた直後のみで発生してます。 一度ユーザーフォームを出し、閉じたあとは意図通り動き、再度エクセルを開くまで発生しません。 ちなみにUserForm2の Private Sub ButtonEnd_Click() Unload Me UserForm1.Hide End Sub 部分の、UserForm1.HideをUnload UserForm1にすると、「オブジェクト変数または With ブロック変数が設定されていません」と出てデバックでModule1の UserForm1.Show が黄色になります。 どこが悪いか教えてください。

  • エクセルのユーザーフォームについて

    パスワード入力用のしかけです。 ワークシートに配置したコマンドボタンを押してユーザーフォームを呼び出します。 Private Sub CommandButton1_Click() UserForm1.Show End Sub ユーザーフォームにはテキストボックスとコマンドボタンを配置しております。 テキストボックスのPasswordCharには * を設定しました。 Private Sub CommandButton1_Click() If StrConv(TextBox1.Text, vbLowerCase) = "abcd" Then MsgBox "OK!" Unload Me Else TextBox1.Text = "" TextBox1.SetFocus End If End Sub これで、ABCDまたはabcdと入力され、ユーザーフォーム上のコマンドボタンをクリックすれば、ユーザーフォームは消えます。 でも、いちいちマウスでクリックするのが面倒なのでEnterキー1回でユーザーフォームを消したいのです。 今でも、一度Enterキーを押すと、ボタンにフォーカスが移動するので、さらにEnterで消えますが、二度ではなくEnterキー1回でユーザーフォームを消すにはどうすればよいのでしょうか? ユーザーフォームは使ったことがないのでわかりません。 よろしくお願いします。

  • ユーザーフォームにての記述を教えて下さい

    エクセル2010で「値のみコピー」だけでなく「値と文字色のみコピー」のユーザーフォームにての記述を教えて下さい。 ちなみに「値のみコピー」のユーザーフォームにての記述は次のとおりです。 これをどう加工したらいいでしょうか。 Private Sub CommandButton1_Click() Selection.PasteSpecial Paste:=xlPasteValues UserForm1.Hide End Sub Private Sub CommandButton2_Click() UserForm1.Hide End Sub

  • Excel ユーザーフォームのコンボボックスについて

    始めまして、マクロに関してはまだまだ勉強中なのですが、ユーザーフォームのコンボボックスについてつまづいてしまい、皆さんにご教授頂ければと思います。 一つユーザーフォームを作成後、そのフォーム内にコンボボックスを配置し、リストから項目を選択できるようにしたいと考え下記のように記述したのですが、ユーザーフォームを実行してもフォームは表示されてきますが、ボックスを選択してもリストに項目が表示されてきません。 Private Sub cmd入力_Click() End Sub Private Sub 選択グループCombo_Change() With 選択グループCombo .AddItem "初級" .AddItem "中級" .AddItem "上級" Private Sub cmd閉じる_Click() Unload Me End Sub この記述自体が間違っているのでしょうか。 宜しくお願いします。

  • エクセル2010のユーザーフォーム記述について。

    エクセル2010でセルのコピーペーストの質問です。次のような記述がユーザーフォームにあります。これだと、なぜか貼り付け先のセルのすぐ上のセルの条件付き書式まで貼り付け先に貼り付けられてしまいます。 どのような記述をすれば不具合を解消できますか。 Private Sub CommandButton1_Click() Selection.PasteSpecial Paste:=xlPasteAllExceptBorders Selection.PasteSpecial Paste:=xlPasteValues UserForm1.Hide End Sub Private Sub CommandButton2_Click() UserForm1.Hide End Sub

  • エクセルユーザーフォームで困ってます。

    エクセル初心者です。 自分のユーザーフォーム(住所、商品登録)を作りたくて大変困ってます。 下記は、ネットなどをみて貼り付けたのですが、上手くいきません。 まずTOPページを作り、ユーザーフォームを呼び出すボタンを作り、クリックすると フォームが出るようにしてあります。 そこに、自分の入力したいものをユーザーフォームにテキストでつくり、シート9に 登録ボタンを作りクリックしたら、シートに反映させたいと思ってます。 登録ボタンを押したら、入力画面はクリアにしたいです。 他にいろいろやりたい事もあるのですが、入力した順番に001・002・003と顧客番号をつけたり 検索ボタンを作って、名前や、顧客番号を入れると情報を呼び出したり、請求書用のプリントシートや、封筒シートに簡単に反映できればと思っています。 しかし、まだまだそこまではいかず、最初でつまずいてます。 現状は、フォームを呼び出すときに実行時エラーがでます。 どうしても、自分の使い勝手のいいものを作りたいので どうか、助けてください。大変まいってます。 長文になりますが、どうかよろしくお願いします。 下記の入力中のものをみていただけて、いろいろ意見をいただけるとありがたいです。 Sub FormShow() UserForm1.Show End Sub 'Sheet9へ書き込む Private Sub 登録_Click() Dim i As Integer With Worksheets(9) 'テキストボックスの値を書き出し For i = 1 To 80 .Range("B" & i) = UserForm1.Controls("TextBox" & i).Text Next End With End Sub 'Formを呼び出したとき、Sheet9から読み込む Private Sub UserForm_Initialize() Dim i As Integer With Worksheets(9) 'テキストボックスの値を読み込み For i = 1 To 80 UserForm1.Controls("TextBox" & i).Text = .Range("B" & i) Next End With End Sub '終了ボタン Private Sub CommandButton2_Click() Unload Me End Sub

  • EXCEL VBAのユーザーフォームに引数を渡す方法について

    すいません、EXCEL VBAのユーザーフォームに引数を渡す方法についてご質問があります。 シート上にコマンドボタンを2つ用意する。 コマンドボタン1を押すと変数mは1 コマンドボタン2を押すと変数mは2 としてユーザーフォームを呼び出す。 Public m As Integer Private Sub CommandButton1_Click()  m = 1  Call フォーム呼び出し(m) End Sub Private Sub CommandButton2_Click()  m = 2  Call フォーム呼び出し(m) End Sub Sub フォーム呼び出し(m As Integer)  UserForm1.Show End Sub 次にユーザフォームにコマンドボタンを1個置き、 ボタンを押したとき、mが1であれば「ボタン1」 mが2であれば「ボタン2」 とメッセージボックスを出し、ユーザーフォームを閉じる。 Private Sub CommandButton1_Click()   If m = 1 Then    MsgBox "ボタン2"   ElseIf m = 2 Then    MsgBox "ボタン2"   End If  Unload UserForm1 End Sub プロシージャ間の引数渡しは色々なテキストに載っているのですが ユーザーフォームに引数を渡す方法はどうも見つからず、 Private Sub CommandButton1_Click(m) としても、コンパイルエラーとなってしまいます。 よろしくご教示をお願いいたします。

  • マクロ ユーザーフォームが表示されない

    いつも回答して頂き、ありがとうございます。 Sub UserForm1() UserForm1.Show End Sub と記述しましたが、エラーが発生し、ユーザーフォームが表示してくれません。 コンパイルエラー:Functionまたは変数が必要です フォームはコマンドボタンを一つ配置し、 Private Sub CommandButton1_Click() Unload UserForm1 End Sub と記述してあるだけです。何が悪いのでしょうか?御教授の程宜しくお願い致します。

  • エクセルVBA、ユーザーフォーム[×]活用法?

    いま、VBAでマクロを作成中なのですが、 ユーザーフォームの右上に存在する×ボタンの使い方がよくわかりません。 マクロのイメージは以下のとおりです。 ユーザーフォーム・オブジェクト ┌─────────────┐ │              【×】  │←この×ボタンです │                   │ │  ┌───────┐    │ │  │ Button1     │    │ Private sub Button1_Click()   ・      ・ If Button_×_click Exit sub Else ・        ・ End If End Sub ×ボタンをコマンドボタンのように動作させるイベントマクロを作成するにはどのように コーディングしたらよいのかさっぱりわからずこまっています。 どうかご回答のほどよろしくおねがいもうしあげますm( _ _ )m

  • ユーザーフォームに入力したデーターが転記できない

    いつもお世話になります。 Windows7 excell2010 です。 いろんなものに勉強してここまでに作成したユーザーフォームですが、データーは入力できるのですがコマンドボタンをクリックしても各セルに反映されません。 色々と試行錯誤していますがうまくゆきません。 どこに不具合があるかわからず恐れ入りますがどなたかご指導いただけませんか。 参考にコードは参考に下記にします。 ユーザフォームのVBAは下記です コード ※Module1 Sub 売上() Do UserForm1.Show Loop End Sub Sub 入金() Do UserForm2.Show Loop End Sub ※UserForm1 Private Sub UserForm_Initialize() With ComboBox1 .AddItem "1" .AddItem "2" .AddItem "3" End With End Sub Private Sub CommandButton1_Click() n = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(n, 2) = UserForm1.TextBox1.Text Cells(n, 3) = UserForm1.TextBox2.Text Cells(n, 4) = UserForm1.TextBox3.Text Cells(n, 11) = UserForm1.ComboBox1.Text Unload Me End Sub Private Sub CommandButton2_Click() Unload Me End End Sub ※UserForm2 Private Sub CommandButton1_Click() n = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(n, 2) = UserForm2.TextBox1.Text Cells(n, 3) = UserForm2.TextBox2.Text Cells(n, 4) = UserForm2.TextBox3.Text Unload Me End Sub Private Sub CommandButton2_Click() Unload Me End End Sub

専門家に質問してみよう