VBSを使ってExcelの任意シートを開く方法

このQ&Aのポイント
  • VBScriptを使用して、Excelの任意のシートを開く方法について教えてください。
  • VBScriptで、同一フォルダにある複数のExcelファイルから特定のシートを順番に開く方法を知りたいです。
  • 問題は「漢字」のシートを選択するとエラーメッセージが表示されることです。漢字のシートを選択しても成功する方法を教えてください。
回答を見る
  • ベストアンサー

VBSを使って Excel の任意シートを開くには

VBS初心者です。知識のある方、ご教授願えませんか。 VBScript で同一フォルダにある「複数の Excelファイルを順番に任意のシートを選択して 開く」というのを実行したいのですが、どのようにすればよいでしょうか 仕事で急に必要になったのですが、VBScript の知識がなく困っていおります。 色々と調べてシート名が「半角英数字」なら成功したのですが、「漢字」の場合は「インデックスが有効範囲にありません」とエラーメッセージがでます。 「漢字」のシートを選択した場合でも成功するようにしたいのですが、どなたかご教授願えませんでしょうか? (●成功例)「半角英数字」のシートを指定した場合 Option Explicit Dim bk, ex, f, gf, sh, so Set so = CreateObject("Scripting.FileSystemObject") Set gf = so.GetFolder(".") Set ex = CreateObject("Excel.Application") ex.Application.DisplayAlerts = False ex.Visible = true For Each f In gf.Files If LCase(so.GetExtensionName(f.Name)) = "xlsm" Then Set bk = ex.Workbooks.Open(gf & "\" & f.Name) ex.worksheets("shukei").select Set sh = bk.Worksheets(1) End If Next MsgBox("Finished!") (●失敗例)「漢字」のシートを指定した場合 Option Explicit Dim bk, ex, f, gf, sh, so Set so = CreateObject("Scripting.FileSystemObject") Set gf = so.GetFolder(".") Set ex = CreateObject("Excel.Application") ex.Application.DisplayAlerts = False ex.Visible = true For Each f In gf.Files If LCase(so.GetExtensionName(f.Name)) = "xlsm" Then Set bk = ex.Workbooks.Open(gf & "\" & f.Name) ex.worksheets("集計").select Set sh = bk.Worksheets(1) End If Next MsgBox("Finished!")

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.1

多分文字コードの問題だと思いますのでメモ帳でしたら該当VBSをメモ帳から文字コードをANSIにして開き「集計」が文字化けしてたら修正して保存して、再度実行してみてください。

HAL_2020
質問者

お礼

kkkkkmさま。 ご回答ありがとうございました。文字コードをANSIにて保存し直したところ、改善致しました。 本当に助かりました。感謝申し上げます。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

失敗例の方で、やってみたが、参考までに。 >ex.worksheets("集計").select は、bk.worksheets("集計").selectではないですか? bkブックには、必ず「集計表」という、シートがありますか? 存非のチェックを入れて、対処のコードをいれた方がよいかも。 >Set sh = bk.Worksheets(1)で言う、Worksheets(1)との関係は。 VBAコードだけをあげて、「誤りが出ました」では、一般に事情が分からないと思いませんか。 エラーは(1)コードがまずい(2)問題にしている、データとのコードの相性が間違っている(予想外のデータの出現など)  の2つあり、(2)を軽視してはいけない。 初心者を脱すると、ほとんど(2)のタイプで苦しむように思う。それも2つ以上のくみあわせで。 === 私が勝手に質問のコードを変えてやった例 ・xlsmが、小生の当フォルダーにたくさんあるので、先頭の5つに限った。 ・bk.Worksheets("Sheet1").Select Set sh = bk.Worksheets(1) は勝手に想像で変えた。 ==== Sub test01() Dim bk, ex, f, gf, sh, so Set fso = CreateObject("Scripting.FileSystemObject") 'Set gf = Fso.GetFolder(".") Set gf = fso.GetFolder("C:\Users\xx\Documents") Set ex = CreateObject("Excel.Application") ex.Application.DisplayAlerts = False ex.Visible = True n = 0 For Each f In gf.Files If LCase(fso.GetExtensionName(f.Name)) = "xlsm" Then n = n + 1 MsgBox gf & "\" & f.Name Set bk = ex.Workbooks.Open(gf & "\" & f.Name) bk.Worksheets("Sheet1").Select Set sh = bk.Worksheets(1) bk.Close End If If n >= 5 Then Exit For Next MsgBox ("Finished!") End Sub

HAL_2020
質問者

お礼

imogasiさま。 丁寧にご回答頂きありがとうございました。感謝申し上げます。

回答No.2

すでに回答が出ておりますが、 VBS スクリプトとして使えるのは ANSI か UTF16です。 編集で開き、ANSI か UTF16 で保存し直すのが、早いと思いますよ。

HAL_2020
質問者

お礼

Qchan1962さま。 ご回答ありがとうございました。感謝申し上げます。

関連するQ&A

  • エクセルの各シートに複数のtxtファイルを取り込む

    はじめまして. Excel2013を用いたデータ整理でわからない部分があるため, 質問させていただきました. 同じフォルダに入った,複数(40個程度)のテキストファイルを, エクセルの複数のシートにそれぞれ取り込みたいと考えています. 具体的には,同じフォルダに入っている, A001.txt, A002.txt, A003.txt, .... というテキストファイル群を, Data_A.xlsxのSheet1にA001.txt       Sheet2にA002.txt       Sheet3にA003.txt といったように取り込みたいです. テキストファイルは, X_座標 Y_座標 X_速度 Y_速度 の四列で構成されており,タブでそれぞれ区切られています. 行数は20,000程度です. 以前,同様の質問をされた方の回答にありました以下のマクロを実行してみたのですが, ・タブで区切られず,一つのセルに四列分の文字が入力される. ・0の情報が消えてしまう. という二つの問題が発生しました. Sub ReadTextFiles()   Const DirName = "C:\TEMP"   '上記で指定されたフォルダに存在するファイルで、   '拡張子がtxtのものをすべて1シートとして読み込む   Dim fs, dir, fc, f1, stream As Object   Set fs = CreateObject("Scripting.FileSystemObject")   Set dir = fs.GetFolder(DirName)   Set fc = dir.Files   For Each f1 In fc     If LCase(fs.GetExtensionName(f1.Name)) = "txt" Then       Worksheets.Add after:=Worksheets(Worksheets.Count)       Sheets(Worksheets.Count).Name = f1.Name       Set stream = f1.OpenAsTextStream       Do While stream.AtEndOfStream <> True         Cells(stream.Line, 1) = stream.ReadLine       Loop       stream.Close     End If   Next End Sub これらを解決した上で,ファイルを取り込む方法を教えていただきたいです. お手数ですが,よろしくお願い致します.

  • VBSで特定のディレクトリのファイルを上書きする

    C:\app\XXXXX\a\b\c\d\e\1.txt ■条件1 上記の1.txtを上書きしたい ■条件2 保護がかかっているので、XCOPYの要領で強制的に上書きしたい ■条件3 XXXXXがユーザーごとの名称になっている為、そこを無視したい ■条件4 C:\app\XXXXX\a\b\c\d\e\f\1.TXTという似たファイルがあるので、完全一致させたい ■条件5 実行するのはエンドユーザーで、管理者実行時のPWは周知していない 以上の条件の元、調べながらやってみたのですが、うまくいきません 下記の内容のどこを直せばいいでしょうか ------------------- Option Explicit Dim WMI, OS, Value, Shell do while WScript.Arguments.Count = 0 and WScript.Version >= 5.7 Set WMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set OS = WMI.ExecQuery("SELECT *FROM Win32_OperatingSystem") For Each Value in OS if left(Value.Version, 3) < 6.0 then exit do Next Set Shell = CreateObject("Shell.Application") Shell.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ uac", "", "runas" WScript.Quit loop Dim co, dt, f, gf, m, mf, n, so dt = CreateObject("WScript.Shell").SpecialFolders("Desktop") mf = dt & "\1.txt" co = "product\11.2.0\client_1\network\admin" Set so = CreateObject("Scripting.FileSystemObject") Set gf = so.GetFolder(so.GetParentFolderName(WScript.ScriptFullName)) n = so.GetFileName(mf) For Each f In gf.SubFolders m = f & "\" & co If so.FolderExists(m) = True Then If so.FileExists(m & "\" & n) = True Then so.CopyFile mf, m & "\" & n, True End If End If Next Set gf = Nothing Set so = Nothing MsgBox("おわり") -------------------

  • VBSのFor文

    VBSのドキュメントをダウンロードし、その中にFor文のサンプルがあったんですが、この構文の"f1"はどういった役割をしているのでしょうか?教えてください。 Dim fso, f, fc, f1,s Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.GetFolder("c:\work") Set fc = f.files For Each f1 in fc s = f1.name Next

  • 複数ファイルをエクセルに取り込む方法

    複数のテキストファイルを各シート毎にエクセルマクロを用いて貼りつけたいです。 【テキストの内容】 AAA BBB CCC DDD・・・ EEE FFF GGG HHH・・・ III JJJ KKK LLL・・・ ・ ・ ・ 上記のようなようなデータが書かれた複数のテキストファイルを各シート毎に張り付けるマクロを探していたところ 下記のようなものを見つけました。 しかし、 マクロを動かした所、一つのセルに一行分が入ってしまいます。 例)セルA1に AAA BBB CCC DDDが貼り付けられてしまう セルA2に EEE FFF GGG HHHが貼り付けられてしまう 可能であればスペース区切りでセルA、セルB、セルCに分けたいです。 例)セルA1に AAAが貼り付けられる セルB1に BBBが貼り付けられる セルC2に CCCが貼り付けられる スペース区切りで張り付けらる方法をご教示ください。 =========================== Sub ReadTextFiles() Const DirName = "C:\TEMP" '上記で指定されたフォルダに存在するファイルで、 '拡張子がtxtのものをすべて1シートとして読み込む Dim fs, dir, fc, f1, stream As Object Set fs = CreateObject("Scripting.FileSystemObject") Set dir = fs.GetFolder(DirName) Set fc = dir.Files For Each f1 In fc If LCase(fs.GetExtensionName(f1.Name)) = "txt" Then Worksheets.Add after:=Worksheets(Worksheets.Count) Sheets(Worksheets.Count).Name = f1.Name Set stream = f1.OpenAsTextStream Do While stream.AtEndOfStream <> True Cells(stream.Line, 1) = stream.ReadLine Loop stream.Close End If Next End Sub ===========================

  • 異なるワークシートに値を貼り付けるマクロ

    数式の入ったワークシートから値のみをコピー&ペーストしたいのですが、うまくいきません。 どこにxlPasteValuesを入れたらいいのでしょうか?よろしくお願いします。 Sub copypaste() Dim bk As Workbook Set bk = Workbooks("‘貼り付け先.xlsm") Workbooks("Book1.xlsm").Worksheets("Sheet1").Range("B2:F6").Copy bk.Worksheets("Sheet1").Range("B2:F6")

  • エクセル 複数シートを一つのシートにまとめるマクロについて

    エクセル 複数シートを一つのシートにまとめるマクロについて こんにちは いつもお世話になっています あるサイトから上記の目的のマクロを参考にして試したんですが、所有してるデスクトップPCでは成功するのに、ノートPCでは次のエラーが出ます。 「コンパイルエラー 変数が定義されていません」そして、以下に載せたコードの「k = 1」の部分が青い背景色になります。とりあえず、デスクトップでできるので間に合うのですが、ノートPCでのトラブル理由を今後のために勉強したいのです。理由を教えてください。 エクセル2003 SP3 ノートPCは工人舎のモバイルSA1F0 参考にさせていただいたサイトは「エクセル 複数シートを一つに集約」 http://okwave.jp/qa/q1608016.html?order=DESC&by=datetime コード引用 集約用にSheet3を確保します・ Sheet3以外の全シートを集約します。 Sub test07() Dim sh3 As Worksheet Dim sh As Worksheet Set sh3 = Worksheets("Sheet3") k = 1 For Each sh In ActiveWorkbook.Worksheets If sh.Name <> "Sheet3" Then MsgBox sh.Name sh.UsedRange.Copy sh3.Cells(k, "A").Select sh3.Paste k = k + sh.UsedRange.Rows.Count End If Next End Sub 引用終わり よろしくお願いします

  • VBScriptでExcel(インデックスが…)

    昨日も質問をしたばかりで、自分でも情けないのですが… (すみません、2つ分からないことがあります。) VBScriptでExcelのファイルの中身を 別のファイルにコピーするプログラムを作りました。 見にくい変数名で申し訳ないのですが、 これを実行すると、17行目で 「インデックスが有効範囲にありません」 というエラーメッセージが出て止まってしまいます。 しかし、ここで「Set」しているファイルは 「Original.xls」というファイルなのですが、 シートは20個あります。 この20個という数は、絶対にあり得ない数で、 読み込み側のファイルのシートは最大で17個ですので、 数が足りないはずはありません。 だいたい、「インデックス…」というのは配列変数と思って 処理しているのでしょうか? 何より、プログラムの最初の方に 「On Error Resume Next」を置くと、 このプログラムの所期の目的である、 読み込んだファイルの中身を 「Original.xls」にペースとして ファイル名をかえて保存する というのは実現できています。 2つ目の問題は、 22行目から24行目で 「Original.xls」の不要なシートを削除しているのですが、 途中に「MsgBox」を置いて、 「s」や「i」の値を調べてみても問題はないのに、 シートが1つしか残りません。 例えば、読み込んだファイルのシートの数が3なら 「s + 1 = 4」ですから、この「For~Next」ループは 「4~20」までの17回実行され、 その間、常に4番目のシートを削除し続け、 結果として、必要な1~3のシートが残るはずなのですが、 常に19個削除されてしまいます。 本来は、「Original.xls」のシートの数は1つにしておいて、 必要な数だけ、その1つのシートをコピーで増やしたかったのですが、 それも分からず、仕方なしにこんなやり方をしました。 やはり、そのやり方でないと、ダメなのでしょうか? 以上、ややこしい質問で申し訳ないのですが、 お分かりの方がおられましたら、お教えください。 Option Explicit '01 Dim d, i, s, t, u, v, w, x, y, z '02 Set t = CreateObject("Scripting.FileSystemObject") '03 Set u = t.GetFolder(".") '04 Set v = CreateObject("Excel.Application") '05 Set w = v.Workbooks.Open(u & "\Result\Original.xls") '06 '07 v.Application.DisplayAlerts = False '08 v.Visible = False '09 '10 For Each d In u.Files '11 If t.GetExtensionName(d.Name) = "xls" Then '12 Set x = v.Workbooks.Open(u & "\" & d.Name) '13 s = x.Worksheets.Count '14 For i = 1 to s '15 Set y = x.Worksheets(i) '16 Set z = w.Worksheets(i) '17 z.Name = y.Name '18 y.Range("A1:U55").Copy z.Range("A1") '19 y.Range("AB1:AF55").Copy z.Range("V1") '20 Next '21 For i = s + 1 to 20 '22 .Worksheets(s + 1).Delete '23 Next '24 x.SaveAs(u & "\o_" & d.Name) '25 w.SaveAs(u & "\Result\" & d.Name) '26 x.Close '27 End If '28 Next '29 '30 v.Quit '31 Set z = Nothing '32 Set y = Nothing '33 Set x = Nothing '34 Set w = Nothing '35 Set v = Nothing '36 Srt u = Nothing '37 Set t = Nothing '38 '39 MsgBox("Finished") '40 よろしく、お願い致します。

  • VBSで指定したフォルダー内のファイルを書き出さないようにする

    あるフォルダ以下のファイル名を出力ファイル、f.name.txtに書き出すのですが "新しいフォルダ"というフォルダのなかにあるファイルは書き出さないようにしたいのですが、意に反してフォルダー内の全てのファイル名を書き出してしまいます。どこがおかしいのでしょう? ********************************************** Set FSO = CreateObject("Scripting.FileSystemObject") Set fl = WScript.CreateObject("Scripting.FileSystemObject") Set abc = fl.CreateTextFile("f.name.txt") ShowSubfolders FSO.GetFolder(".") Sub ShowSubFolders(Folder) For Each File in Folder.Files 'Folder内のファイルを列挙する Fname = File.name FolderCheck=Folder & "\" & "新しいフォルダ" If Folder <> FolderCheck Then abc.Write Folder & "\" & Fname & vbCrLf End If Next For Each Subfolder in Folder.SubFolders 'Foler内のフォルダを列挙する ShowSubFolders Subfolder '再帰呼び出し Next End Sub abc.Close

  • VBA なんですが

    VBA なんですが すべてのワークシートを順番に選択して 指定した範囲をコピーし『まとめ』と言う別のシートに貼り付けたいのですが どうしたらいいのかわかりません。 それらしいのは考えたのですが Set sh = Worksheets(sh.Name)でエラーになります。 頭がいいかた教えてください。   Dim sh3 As Worksheet Dim sh As Worksheet Dim en As Long Set sh3 = Worksheets("まとめ") For Each sh In ActiveWorkbook.Worksheets If sh.Name <> "まとめ" Then en = sh.UsedRange.Rows.Count Set sh = Worksheets(sh.Name) sh.Range(Cells(2, 1), Cells(en, 10)).Copy

  • VBSでファイル名にシート内のセルの値を付け足す

    現在下記のコードが書いてあるvbsにエクセルファイルをドラック&ドロップをしてパスを外したり、つけたりしています。 その際に、投げ込んだエクセルファイルのファイル名の頭に 投げ込んだエクセルファイルのシート1のセルA1の値を付けたいと考えています。 例 パスのかかっている 間隔.xls というファイルをVBSに投げ込むと パスが外れ ファイル名が あいう間隔.xls という名前に代わって保存される。コピーではなく投げ込んだシートの名前が変わって問題ありません。 あいう はシートのA1セルに入っていた文字です。 ブック内にシートは必ず1つしかありません。 Option Explicit 'Excel 2013 Later Japenese Version Available 'REF: 'REF: '''///---定数の設定Set Enumuragion---///''' Const PWD="paspas" Const msoLanguageIDInstall = 1 '''///---変数の宣言---///''' Dim objArgs, I , strFile Dim objFile, objFolder,objPath,strScr Dim xlApp,Wb Dim objWShell : Set objWShell = Createobject("WScript.Shell") Dim FSO : Set FSO = Createobject("Scripting.FileSystemObject") '''///---ファイル処理開始 Start Document File Conversion---///''' Set objArgs = Wscript.Arguments For I = 0 to objArgs.Count-1 set objFile = FSO.GetFile(cstr(objArgs(I))) If Lcase(Left(FSO.GetExtensionName(objFile.Path) ,3) )="xls" Then Set xlApp =CreateObject("Excel.Application") If xlApp.Version < 14 Then xlApp.Quit: Set xlApp = Nothing:wscript.Quit xlApp.DisplayAlerts=False xlApp.Visible = False set wb=xlapp.WorkBooks.Open(objFile.Path,0,false,,PWd,,True,,false,false,,true,true) if wb.HasPassword=true then wb.Saveas objFile.Path,,"","",False else wb.Saveas objFile.Path,,Pwd,"",False End if wb.close set wb=nothing End If Next xlApp.DisplayAlerts=True xlApp.Quit set xlApp = Nothing このコードをどのように変更すればできますでしょうか?

専門家に質問してみよう