• 締切済み

エクセルVBA/シートの背景の変更

エクセル2000です。 VBAでワークシートに背景を設定する場合、PC内に保存してあるファイルを使うなら以下でできます。 Sub haikei() With ActiveSheet .SetBackgroundPicture Filename:="C:\TEST\shape.jpg" End With End Sub これを、PC内ではなくワークシート上にオブジェクトとして貼り付けたJpegファイルを使って背景を設定するにはどのようなコードになるのでしょうか? ワークシート上のオブジェクトの名前は 「オブジェクト 1」 となっており、クリックすると数式バーには =EMBED("Photo Editor Photo","") と表示されます。 こんなことをしたい理由は、状況により配布した(自分のPC上でない)BOOKのワークシートの背景を一定の条件で変更したいためです。そのため、複数のJpegファイルを非表示にしたワークシート上にはりつけておき、背景の差し替えを行いたいと考えています。

みんなの回答

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.3

>で一応出来ましたが、出来ればPC内に保存させたくないのです。 元ファイルは、Killステートメントで削除すればどうでしょうか。

merlionXX
質問者

お礼

何度もありがとうございます。 一番最初の質問で書いたとおり、このBOOKはわたし以外の人たちが使うものなのです。そのため環境もよくわからない(Officeは2000~2007、OSは2000~Vistaまであります)他人のPC内に勝手にファイルを保存し、それを削除するというようなことをして良いものか、非常に迷うのです。 またそれがOKだとしても、保存するフォルダーをどうするか、ファイル名が重複してたらどうしよう、とか懸念されることがいろいろあります。 きっと一番いいのはフォルダー名を検索して、存在しないフォルダーを作り、そこに保存して、終了時にフォルダーごと削除してしまうようにすれば名前の重複も心配することはないのでしょうが、2000~Vistaまで対応したそのようなコードは残念ながらわたしには書けそうもありません。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.2

回答番号:No.1 この回答への補足 で提示されたコードをコピペしましたが、コンパイルエラーは発生しません。 当方Excel2007です。 ただ、test01の方では LoadPictureFromCBの返り値をSavePictureで一旦保存しなければなりません。 保存後に、そのファイルをSetBackgroundPictureするようにします。

merlionXX
質問者

お礼

> LoadPictureFromCBの返り値をSavePictureで一旦保存しなければなりません ありがとうございました。 ということは一旦、PC内のどこかのフォルダーに名前を付けて保存しなければならないということでしょうか? Sub test02() Selection.Copy SavePicture LoadPictureFromCB(), "C:\TEST\myPic.bmp" With ActiveSheet .SetBackgroundPicture Filename:="C:\TEST\myPic.bmp" End With End Sub で一応出来ましたが、出来ればPC内に保存させたくないのです。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.1

「Webページとして保存」すると画像ファイルが生成されます。 その画像ファイルを取り込むようにすればどうでしょうか。 ExcelファイルをWebページとして保存する http://allabout.co.jp/computer/msexcel/closeup/CU20081005A/index2.htm あるいは、Windows APIを使って、コピーした画像データをファイル保存して使うこともできます。 下記shiraさんのページが参考になります。 EXCEL VBA TIPs. [ クリップボードにコピーした画像を、ペーストするために取りだす方法。] http://oshare2iketeru.blog80.fc2.com/blog-entry-1413.html

merlionXX
質問者

お礼

さっそくありがとうございます。 Webページとして保存させたくないので、ぜんぜん内容を理解できぬままに補足欄に記載のコードで、やってみました。 test01を実行すると、 Data4(0 To 7) As Byte のところでコンパイルエラー「型が一致しません」が出てしまいました。 どこがおかしいのでしょうか?

merlionXX
質問者

補足

エラーになったコード Option Explicit Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte 'ここでコンパイルエラー「型が一致しません」が出る!!! End Type Private Type PICTDESC cbSizeofstruct As Long picType As Long hemf As Long Padding(0 To 1) As Long End Type Const PICTYPE_ENHMETAFILE = 4 Private Declare Function OleCreatePictureIndirect _ Lib "olepro32.dll" _ (lpPictDesc As PICTDESC, riid As GUID, _ ByVal fOwn As Long, lplpvObj As Object) As Long Private Declare Function OpenClipboard Lib "user32" _ (ByVal hWndNewOwner As Long) As Long Private Declare Function CloseClipboard Lib "user32" () As Long Private Declare Function GetClipboardData Lib "user32" _ (ByVal uFormat As Long) As Long Const CF_ENHMETAFILE = 14 Private Declare Function CopyEnhMetaFile Lib "gdi32" _ Alias "CopyEnhMetaFileA" _ (ByVal hemfSrc As Long, ByVal lpszFile As String) As Long Private Declare Function DeleteEnhMetaFile Lib "gdi32" _ (ByVal hemf As Long) As Long 'クリップボードから Picture オブジェクトを取り出す関数 '※画像がない場合は nothing を返す Public Function LoadPictureFromCB() As Object Dim IID_IDispatch As GUID Dim pd As PICTDESC Dim objResult As Object Dim hemf As Long If OpenClipboard(0) Then hemf = GetClipboardData(CF_ENHMETAFILE) ' ハンドルを複製してから使用する hemf = CopyEnhMetaFile(hemf, vbNullString) CloseClipboard End If If hemf = 0 Then Set LoadPictureFromCB = Nothing Exit Function ' 失敗 End If With IID_IDispatch .Data1 = &H20400 .Data4(0) = &HC0 .Data4(7) = &H46 End With With pd .cbSizeofstruct = Len(pd) .picType = PICTYPE_ENHMETAFILE .hemf = hemf End With If OleCreatePictureIndirect(pd, IID_IDispatch, _ 1, objResult) >= 0 Then ' 成功時 Set LoadPictureFromCB = objResult Else ' 失敗時 DeleteEnhMetaFile hemf Set LoadPictureFromCB = Nothing End If End Function Sub test01() Selection.Copy With ActiveSheet .SetBackgroundPicture Filename:=LoadPictureFromCB() End With End Sub

関連するQ&A

  • エクセルVBAでフォームの無効化(2)

    http://odn.okwave.jp/kotaeru.php3?q=1942213 の質問の追加質問なのですが、 ワークシート上に配置したフォームのコンボボックス(DropDowns)をマクロにて無効とさせる方法です。 シート保護されている場合、 DropDownオブジェクトを個別に指定して Sub TEST3() With ActiveSheet .DropDowns("Drop Down 7").Enabled = False .DropDowns("Drop Down 8").Enabled = False .DropDowns("Drop Down 9").Enabled = False End With End Sub とすると、OKなのですが、コレクションオブジェクトとしてまとめてやろうとして、 Sub TEST4() With ActiveSheet .DropDowns.Enabled = False End With End Sub とするとエラーになります。 シート保護のない場合は両方ともOKです。 どういう違いなのでしょうか?

  • エクセルVBAを利用してワークシート名を変更するには

    エクセルVBAを利用してワークシート名を変更するには Sub ~~() Worksheets("sheet1").Name = "新しい名前" End Sub と文献にはあるのですが ワークシート上の名前変更のための コマンドボタンをクリックしたら ある場所のセルの値が名前になるように設定したいのですが どのようにすればいいのでしょうか?? いちおうわからないなりに予想したのは Sub シートの名前変更() ActiveSheets.Name = Range("Z3").Value End Sub これでZ3の値を名前に設定できるのではと思ったのですが うまくいきませんでした

  • Excelシート上のボタンでセルの背景色を設定する

    シート上のボタンを押したときにセルの値と背景色を設定したいのですが、エラーになります。 原因・解決策が分かる方お願いいたします。 Private Sub CommandButton1_Click() With Range("A1") .Value = "Yellow" .Interior.ColorIndex = 6 '実行時エラー1004:InteriorクラスのColorIndexプロパティを設定できません。 End With End Sub 環境 Excel97/Win98

  • 下記のVBAを他のワークシートにも適用する方法?

    下記のVBAを他の同じエクセルファイル内の他のワークシート(Sheet2,Sheet3,Sheet4)にも反映するためにはどのようにしたらよろしいでしょうか? 現在書きVBAを本ワークブックという箇所に貼り付けております。 お手数ですがご教示いただきます様お願いいたします。 Private Sub Workbook_Open() With Sheets("Sheet1") .EnableOutlining = True .Protect Password:="****", UserInterfaceonly:=True End With End Sub

  • エクセルVBA 保護シート&フィルタ実行 全シート

    VBA超初心者です。 たくさんのシートのあるエクセルで、 シート保護後もフィルタを使用できるようにVBAを設定したいと思ってます。 (現在エクセル2000を使用してます) ネットで調べてVBAを設定してみました。 しかし下記のようにするとコンパイルエラーになってしまうのですが、 正しい方法を教えていただけると助かります。 Option Explicit Private Sub Workbook_BeforeClose(Cancel As Boolean)   Application.CommandBars("Cell").Reset End Sub Private Sub Workbook_Open()   With Application.CommandBars("Cell").Controls.Add( _            Type:=msoControlButton, Before:=1, Temporary:=True)     .Caption = "AutoFilter"     .OnAction = "ThisWorkbook.filter"   End With   With Worksheets.Select     .Unprotect     .EnableAutoFilter = True     .Protect UserInterfaceOnly:=True   End With End Sub Private Sub filter()   On Error Resume Next   Selection.AutoFilter End Sub

  • エクセルVBA【ワークシートのコピー】について

    以下のVBA記述で、とあるエクセルファイルのシートをCSV化しようとしております。記述の場合、すべてのワークシートが対象となっていますが、10個くらいあるWorkSheetの【sheets(8)】のみを対象としたいのですが、どのようにしたら良いのでしょうか? お手数ですがご教授下さい。 Sub test() Dim sh As Worksheet Dim fname As String Application.ScreenUpdating = False For Each sh In ActiveWorkbook.Worksheets fname = "C:\temp\" & sh.Name & ".csv" sh.Copy With ActiveWorkbook .SaveAs Filename:=fname, FileFormat:=xlCSV .Close savechanges:=False End With Next sh Application.ScreenUpdating = True End Sub

  • Excel 全シート上のボタンを削除 VBA

    いつも大変お世話になっております。 Excelのシート上のボタンを削除したいと考えています。 ボタンはVBAで自動で作成してます。 Sub ButtonCreate() With ActiveSheet.Buttons.Add(Range("C1").Left, _ Range("C1").Top, _ Range("C1").Width, _ Range("C1").Height) .Characters.Text = "起動" .Characters.Font.Size = 8 End With End Sub シート上にはグラフ等もあるため、 まとめてオブジェクトを消すという方法は取れません。 ボタンのみを消したいと思っています。 Worksheets("テスト").Activate ActiveSheet.Buttons.Delete と削除する方法を取っていますが、 他に方法はありますか? BOOKを指定し、全シート上の ボタンを削除する方法があれば、知りたいです。 回答よろしくお願い致します。

  • EXCEL VBA でマクロが作動するシートとしないシートがある。

    右クリックのショートカットメニューに作成したマクロを追加しました。その追加マクロを実行しても右クリックのショートカットに追加されないシートがあります。同じbookでもその他のシートでは、右クリックのショートカットメニューに追加されているものもあります。 なぜでしょうか? できないのは、右クリックのショートカットの表示です。目的の動作(下記の場合は、フォントの色を変える)は、どのシートでも作動します。 ちなみにプロシージャーは次のように書いています。PERSONAL.XLSに登録してあります。 宜しくお願いします。 'セルの右クリックショートカットメニューを作成 Sub 色々右クリック() 赤みぎクリック 黒みぎクリック 青みぎクリック End Sub Sub 赤みぎクリック() Dim Newb Set Newb = Application.CommandBars("Cell").Controls.Add() With Newb .Caption = "赤" .OnAction = "赤フォント" .BeginGroup = False End With End Sub Sub 赤フォント() Selection.Font.ColorIndex = 3 End Sub Sub 黒みぎクリック() Dim Newb Set Newb = Application.CommandBars("Cell").Controls.Add() With Newb .Caption = "黒" .OnAction = "黒フォント" .BeginGroup = False End With End Sub Sub 黒フォント() Selection.Font.ColorIndex = 1 End Sub Sub 青みぎクリック() Dim Newb Set Newb = Application.CommandBars("Cell").Controls.Add() With Newb .Caption = "青" .OnAction = "青フォント" .BeginGroup = False End With End Sub Sub 青フォント() Selection.Font.ColorIndex = 5 End Sub Sub Reset_RightClick() Dim rightBar As CommandBar Application.CommandBars("cell").Reset End Sub

  • Excel2000 VBA シート名の変更

    なかなかうまくいかずに困っています。 Excel2000  OS:WindowsXp ユーザーフォーム(UserForm1)上に ・Textbox1 ・Textbox2 ・Commandbutton1 があります。 Commandbutton1をクリックすると、Textbox1とTextbox2の値をつなげた文字列を、 アクティブなワークシートの名前にしたいと思っています。 今現在の、うまく動かないコードは以下のとおりです。 Private Sub CommandButton1_Click() 'ユーザーフォーム上のCommandButton1 Dim snday As Variant 'Textbox1に入力される、『日』を取得するための変数 Dim snyoubi As Variant 'Textbox2に入力される『曜日』を取得するための変数 Dim namae As Variant 'シート名になる変数。 Dim Sh As Worksheet snday = UserForm1.TextBox1.Value snyoubi = UserForm1.TextBox2.Value namae = snday & snyoubi Sh.Name = namae End Sub これを実行すると、 実行時エラー’91’ オブジェクト変数または withブロック変数が設定されていません のエラーが出ます。 Sh.Name = namae のところを with ActiveSheet ~End with で挟んでみてもだめでした。 どなたかご教授ねがえませんか。 よろしくお願いいたします。

  • エクセルVBA

    VBAの素人です。 以下のようなVBAを実行しようと、何とか形にしました。 単独のBOOKではうまくいくのですが、同時に他のBOOKを開くと 「インデックスが有効範囲にありません」とエラーになります。 エラー箇所は、With Sheets("Sheet1").Range("B1")部分です。 修正をご教示頂ける方、何卒よろしくお願い致します。 全くVBA無知なのにすみません。 Private Sub Workbook_Open() test01 test02 Application.OnTime Now + TimeValue("00:10:00"), "終了" End Sub Sub 終了() Application.OnTime Now + TimeValue("0:00:02"), "test01", , False ThisWorkbook.Close Savechanges:=False Application.Quit End Sub Sub test01() With Sheets("Sheet1").Range("B1") .Value = Time .NumberFormatLocal = "mm:ss" End With Application.OnTime Now + TimeValue("0:00:02"), "test01" End Sub Sub test02() With Sheets("Sheet1").Range("B2") .Value = Time .NumberFormatLocal = "mm:ss" End With End Sub

専門家に質問してみよう