VBScriptで図形が選択できない

このQ&Aのポイント
  • VBScriptでエクセルの図形を選択する際に「インデックスが境界を超えています」というエラーが発生して困っています。
  • エクセルのマクロでは同じコードを使用して問題なく実現できますが、マクロが含まれないファイル形式で実現したいです。
  • OSはWindows7 64bit、Excelは2010を使用しています。
回答を見る
  • ベストアンサー

VBSCriptで図形が選択できません

困っています。 どなたかご教授願えないでしょうか。 実現したいことは、エクセルで作成したファイル「Book1.xlsm」の最初のSheetに配置された図形のうち、名前にFigが含まれるものだけを選択することです。 VBScriptで実現したいものの、「インデックスが境界を超えています」というエラーが出ます。 なお、エクセルマクロではエラーなく実現できました。 環境は以下のとおりです。 OS:Windows7 64bit Excel:2010 以下、VBScriptのコード→ Option Explicit Dim objExcel Set objExcel = CreateObject("Excel.Application") objExcel.Visible = True Dim objWorkbook Set objWorkbook = objExcel.Workbooks.Open("C:\VBSTest\Book1.xlsm") Dim arrShapeMatched() Dim sp Dim i i = 0 For Each sp In objExcel.Sheets(1).Shapes If InStr(sp.Name, "Fig") >= 1 Then ReDim Preserve arrShapeMatched(i) arrShapeMatched(i) = sp.Name i = i + 1 End If Next objExcel.Sheets(1).Shapes.Range(arrShapeMatched).Select 'この文を実行時、インデックスが境界を超えていますというエラーがでます ←以上、VBScriptのコード なお、ほぼ同様のコードをエクセルのマクロで書くとエラーは出ず、意図した通りの結果になります。 以下、マクロに書いたコード→ Sub SelectShape() Dim arrShapeMatched() Dim sp Dim i i = 0 For Each sp In ActiveSheet.Shapes If InStr(sp.Name, "Fig") >= 1 Then ReDim Preserve arrShapeMatched(i) arrShapeMatched(i) = sp.Name i = i + 1 End If Next ActiveSheet.Shapes.Range(arrShapeMatched).Select 'マクロではエラーにならない End Sub ←以上マクロに書いたコード 投稿の都合上、xlsm形式のファイルを読み込んでいますが、実現したい形はマクロが含まれないファイル形式としたいと考えています。 よろしくお願いします。

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

こんにちは 手元にExcel:2010の環境が無いのでExcel2002で試しましたら objExcel.Sheets(1).Shapes.Range(arrShapeMatched).Select で、"指定したパラメータに無効な値が含まれています。" とエラーが出ました。 objExcel.Sheets(1).Shapes.Range(Array("Fig 4","Fig 5","Fig 6")).Select この様な形では実行されるんですが何故でしょうね そこで代替案ですが For Each sp In objExcel.Sheets(1).Shapes   If InStr(sp.Name, "Fig") >= 1 Then     sp.Select False   End If Next で如何でしょうか? Excel2002では動きましたが・・・

twoflat
質問者

お礼

教えていただいた代替案をためしたところ、Excel2010でも無事実現できました。 エラー発生以降、Rangeメソッドがどんなエラーで躓いているのか調べようと、コールスタックが見れるデバッグ環境を用意して…と彷徨っていましたが、結局いいものが見つからず、途方に暮れていました。 また、ご指摘のように、 objExcel.Sheets(1).Shapes.Range(Array("Fig 4","Fig 5","Fig 6")).Select と同等のコードについては、本質問の掲載前に当方でも試し、問題なく動いたため、不思議で仕方ありませんでした。 当面は教えて頂いた代替案で行きます。 もしエラーの真の原因がわかりましたら、教えて下さい。 回答ありがとうございました。

その他の回答 (2)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

objExcel.Sheets(1).Shapes.Range(objExcel.Transpose(arrShapeMatched)).Select ↑Excel2010でテスト・・・未知の実行時エラーです。 objExcel.Sheets(1).Shapes.Range(objExcel.Index(arrShapeMatched,0,0)).Select ↑Excel2010でテスト・・・OKでした。  Excel2002でもOK

twoflat
質問者

お礼

watabe007様、回答ありがとうございます。 まさかExcel2010でも検討して頂けるとは思っていませんでした。 回答していただいた内容について、こちらの環境でも動作確認し、同じ結果となることを確認しました。 また、追加の状況での動作確認から、現時点では最初に教えて頂いた、 sp.Select False がもっとも汎用性が高い(?)結果となりましたので、Selectメソッドを使おうと考えています。 詳細は以下をご確認ください。 ■追加の状況 ・単独のシェイプを2個追加し、いずれも名前を”Fig”に変更 objExcel.Sheets(1).Shapes.Range(objExcel.Index(arrShapeMatched,0,0)).Select →追加したシェイプはいずれも選択されませんでした。同一の名前を持つ場合、選択できないようです。シェイプそのものを配列に入れているわけではなく、名前だけを配列に入れているので、当然の結果なのかなと思います sp.Select False →追加したシェイプはすべて選択されました。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

Transpose関数を使って配列の行、列を入替えてみました。 objExcel.Sheets(1).Shapes.Range(objExcel.Transpose(arrShapeMatched)).Select Excel2002では動きましたが・・・ ちなみにExcelマクロ側でも ActiveSheet.Shapes.Range(Application.Transpose(arrShapeMatched)).Select を行ったところExcel2002では動きました 行列を入替えるのが本来の方法かも??? でした。

関連するQ&A

  • VBScript 先頭行の固定

    VBScript Script ファイル (.vbs)を書き出して、エクセル表の加工をしようとしています。 Set objExcel = CreateObject("Excel.Application") objExcel.Visible = True Set objWorkbook = objExcel.Workbooks.Open("~~~ ・ ・ ・ 先頭行を固定したく、下記のようにしましたがエラーになります。 objWorksheet.Range("A2").Select objWorksheet.ActiveWindow.FreezePanes = True また、データーのある最下行+2にデーターの合計を入れるように、追加コードを記述したいのですが、どのようにするのでしょうか?

  • VBScript で Excel の Comboboxの操作(値の選択)はできますか?

    VBScript(?)で Excel内に設定されているComboboxを選択するようにさせたいのですがうまくできません。やり方が分かりません。そもそもScriptではできないのでしょうか? Visual Basicでないとできないのでしょうか? どなたかご存知の方がいらっしゃいましたら、教えてください。 本当にほんとうに最近勉強しだしたばかりのため、質問自体がおかしなことを書いているかもしれませんが、その場合はご容赦下さい。 ●会社で使っているEXCEL帳票があるのですが、毎回、同じような内容をマウスで一つ一つセルを選び値を入力したり、メニュー(Combobox?)を選択する作業が面倒なため、Scriptで自動的に値を入れたり選択させて効率化を図ろうと考えています。 普通のセルの場合、次のようなコードで書き込みができるのですが、 あらかじめ登録された内容から選択するセル(=これを"Combobox"というものと理解しています)に対しては、書き込みや選択ができません。 Comboboxのセルの選択は、どのようなコードでできるのか、教えていただけないでしょうか? いろいろ検索してみたのですが、該当するものが見つからなかったため、質問させていただきました。 (上記で書いたVBScriptは、実はWindows Scriptと言うのが正しいかもしれません) <普通のセルに値を書き込む場合> set objExcel = CreateObject("Excel.Application") Set objWorkbook = objExcel.Workbooks.Open("C:\Documents and Settings\xxxxxx\My Documents\test.xls") Set objWorksheet = objWorkbook.Worksheets("YYYYYYYY") ObjExcel.Visible = True objWorksheet.Cells(10, 5).Value = "ZZZ" <Comboboxの値をScriptで選択するには??> .

  • エクセルVBAとVBScript

    WinXP/Pro  エクセル2002使用です。 VBScriptで下記のメール送信のプログラムを作り、 それをエクセルVBA→BATファイル→VBScript(→エクセルVBAに戻る)という流れで自動化させましたが、下記のコードでは、現在進行中のエクセルVBAとは別のブックを作るのでうまくいきません。 (エクセルブックを2重起動してしまいます) Set objExcel =GetObject( "d:\auto\aaa.xls") Dim stradrs Dim strkk Dim strjikan with objExcel stradrs = .Worksheets("Sheet1").Cells(5,1).Value strkk= .Worksheets("Sheet1").Cells(4,1).Value strjikan = .Worksheets("Sheet1").Cells(4,2).Value end with Set objEmail = CreateObject("CDO.Message") objEmail.From = "***@***.com" objEmail.To = stradrs objEmail.Subject = "表題" objEmail.Textbody = "内容" objEmail.AddAttachment("d:\auto\" & strkk & strjikan & ".doc") objEmail.Send Set objEmail = nothing Set objExcel = nothing 目的は、最初に立ち上げている(VBScriptを呼び出したVBAを実行中の)エクセルから値を取得したいのです。 下記いずれかの方法によると思っています。 (1)エクセルVBAから直接VBScriptに引数で値を渡すことは可能でしょうか? (2)VBScriptからエクセルブックを起動させずに値を取得することは可能でしょうか? 値はテキスト文字です。 何卒よろしくお願いします。

  • VBScript実行時エラーについて

    filemakerでデータをコピーし下記のようなVBScriptを使いエクセルファイル(グラフを下準備してある)を開きそのデータを貼り付けグラフを完成させ、そのグラフをgifファイルにエクスポートで保存し、次にfilemaker側でそのgifファイルを読み込む作業するスクリプトを組んでいます。ここで,PCを起動したときとか、作業中でも度々VBScript実行時エラー(パスまたはファイル名が無効です)が発生します。エクスポート先のgifファイル名を替えると1時的に問題は解決しますが・・・あくまで一時的なものなのでなんとか根本的解決策をご教示願います。 Set objExcel = CreateObject("Excel.Application") Set objWorkbook = objExcel.Workbooks.Open("C:\Users\hhh gggg\Documents\FM_Trial\グラフ6.xlsx") objExcel.Visible = True objExcel.Sheets("sheet1").Select Createobject("WScript.Shell").AppActivate("グラフ6.xlsx") ' --A1のセルに値を設定 objExcel.Sheets("sheet1").Range("A1").Select objExcel.Sheets("sheet1").Paste objExcel.Sheets("sheet1").ChartObjects("グラフ 1").Chart. Export ("C:\Users\hhh gggg\Documents\FM_Trial\test61.gif") ' --0.5秒待つ WScript.Sleep(1500) ' --Excel終了 objWorkbook.Close False objExcel.Quit ' --Excelオブジェクトクリア Set objExcel = Nothing

  • C#で複数のエクセルを閉じる方法

    c#で複数のエクセルを起動(オープン)させた後に、起動させたエクセルを閉じる(クローズ) させる為に、下記ソースを記載しましたが、エラーになってしまいます。 ※エラー内容としましては、例えば2ファイルのエクセルを起動させて閉じる場合、1ファイルは正常に閉じれるのですが、もう1ファイルを閉じる際にエラーとなってしまいます ※下記URLの内容を全てやったのですけれども解決できません。 (https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/0f210f52-366... ご教示の程、よろしくお願い申し上げます。 private List<String> filepath = new List<String>(); Excel.Workbook objWorkBook = null; finally { if (objWorkSheet != null) { Marshal.ReleaseComObject(objWorkSheet); objWorkSheet = null; } if (xlSheets != null) { Marshal.ReleaseComObject(xlSheets); xlSheets = null; } if (objWorkBook != null) { for (int I = 0; I < filepath.Count; I++) { objWorkBook.Close(false, filepath[I], true); } Marshal.ReleaseComObject(objWorkBook); objWorkBook = null; } if (objWorkBooks != null) { objWorkBooks.Close(); Marshal.ReleaseComObject(objWorkBooks); objWorkBooks = null; } if (objExcel != null) { objExcel.Workbooks.Close(); objExcel.Quit(); Marshal.ReleaseComObject(objExcel); objExcel = null; } GC.Collect(); }

  • VBScriptで自動リンクONでExcelファイルのOpen

    お世話になっております。VBScriptでExcelの既存ブックファイル をオープンさせるのを見よう見真似で作成したのですが、開こうと しているブックに自動リンクが設定されていて、毎回 「開いているブックには、ほかのファイルへの自動リンク・・・・」 と聞かれ「Y」をクリックしています。 希望としてはYを自動で選択してオープンしてくれたらと思っています。 調べてみてUpdateLinkがTrueとか書けばいいように思っていろいろ 試してみたのですがイマイチうまく行きません。 すいませんが教えてもらえませんか? [Source]------------------------------------------------------- Option Explicit Dim objExcel 'エクセルオブジェクトを作成します Set objExcel = CreateObject("Excel.Application") 'エクセル画面を表示します objExcel.Visible = True 'ワークブックを開きます objExcel.Workbooks.Open "C:\Book1.xls" 'エクセルオブジェクトの破棄 Set objExcel = Nothing

  • VBscript で複数テキストがあるこういう時どうやればいいの?

    <form name="MyF"> <% For nI = 1 to 10 %> <input type="text" name="test<%= nI %>"> <% Next %> </form> で10個のテキストボックスを作って 仮にあるボタンを押した時に すべてのテキストボックスに "aaaa"と書き込む時 クライアントサイドのVbscript で <script language="vbscript"> Sub Allaaa() Dim i For i = 1 to 10 MyF.test & i.value="aaaa" Next End Sub </script> のようなことをしたいのですが、 テキストボックスをこのように扱うことは 不可能なのでしょうか? 開発環境 Windows2000 IE3.02以上 使用言語 【VBscript】 java ではなくて Vbscript で実現したいのです。 また、今は10個のテキストボックスですが 10は可変です。

  • VBA 他のブックから図形にマクロを登録するマクロ

    別のブックから複数あるブックを開いてボタンを作りマクロを登録し、保存して閉じるということを繰り返したいのですが、ボタンを作るところまではできたのですが、ボタンにマクロを登録する際に下記の="A.xlsm!マクロ名"の部分のAを変数もしくは"\\〇〇\" & .Cells(I, "B") & ".xlsm"のように変更したいのですが、できません。 ご教示頂ければと存じます。何卒宜しくお願い致します。 Sheets("〇〇").Shapes("Button 4").OnAction = "A.xlsm!マクロ名"

  • 図形のクリアで入力規則の▼が消える

     図形のクリアでG1の入力規則の▼まで一時的に消えてしまいます。コード文でShapesを 用いているのではないかと思いますが、▼で消去を回避する方法が ありましたらお教え願え ますでしょうか? Windows7・SP1 Office2010 Sub 図形のクリア() Dim myRng As Range Dim sp As Variant Set myRng = Range("I10:CW60") For Each sp In ActiveSheet.Shapes If Not Intersect(Range(sp.TopLeftCell, sp.BottomRightCell), myRng) Is Nothing Then On Error Resume Next sp.Delete End If Next Set myRng = Nothing End Sub

  • エクセルVBA/シェープの文字列を取得

    エクセル2010です。 BOOK内の各シートにボタンやチェックボックス、ラベルやテキストボックスなどが配置されています。 これらの貼り付けられたものの一覧を作りたいのです。 Sub obj_Check() Dim st Dim sp Dim i As Long For Each st In Sheets For Each sp In st.Shapes i = i + 1 With Sheets("Sheet3") .Cells(i, "A").Value = sp.Name ' .Cells(i, "B").Value = sp.Caption ’これがエラー .Cells(i, "C").Value = st.Name End With Next sp Next st End Sub とやってみましたがsp.Captionがエラーになります。 .Cells(i, "B").Value = sp.Shapes.Range.Character.Text としても同じです。 どうやったら、シェープに書かれた文字列が取得できるのでしょうか?

専門家に質問してみよう