• ベストアンサー

VBAでワークブックの名前を変数にして開かせる?

最近VBAを勉強し始めたばかりです。 面白いですね…。 さて、恐らく基礎なんでしょうけれど、行き詰まっているので是非アドバイスをお願いします。 とりあえず、テキスト見ながら作ったマクロですがダメでした。 目的は対話型?で入力した名前のワークブックの名前を開かせるというものです。 Sub Macro1() Dim mywbname As String Dim mymsg As String, mytitle As String myMgs = "開いて欲しいファイル名を入力してください" mytitle = "ファイルを選択" mywbname = Application.InputBox(Prompt:=myMgs, Title:=mytitle) If mywbname <> "False" Then Workbooks.Open Filename:="C:\Documents and Settings\○○○\デスクトップ\mywbname.xls" End If End Sub なんてなものを作ったのですが、mywbnameを変数として受け取ってくれません。なのでそんなファイルはない…なんてことになっています。 構文自体の見直しも含めてアドバイスお願いします。 蛇足かもしれませんが、○○○のところは個人名が入ります。 C:\Documents and Settings\○○○\デスクトップ\mywbname.xls" の箇所のmywbnameを既存のファイル名にしてみるとMgsBoXに適当な文字さえ入れれば、そのファイルは開いたので問題なのはmywbnameを入力した名前に置き換えてくれない部分だと思うのですが、よろしくおねがいします。

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

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.2

>問題なのはmywbnameを入力した名前に置き換えてくれない部分だと思うのですが その通りです、変数と文字列の連結方法が間違っています >Workbooks.Open Filename:="C:\Documents and Settings\○○○\デスクトップ\mywbname.xls" Workbooks.Open Filename:="C:\Documents and Settings\○○○\デスクトップ\" & mywbname & ".xls" とします したのマクロを実行してみてください Sub test() Dim 変数 As String 変数 = "変数を""""でくくっていない" MsgBox "こちらは変数を""""でくくった例です" MsgBox "こちらは" & 変数 & "例です" End Sub 違い分かりますか 修正したものを載せておきます Sub Macro1() Dim mywbname As String Dim mymsg As String, mytitle As String mymgs = "開いて欲しいファイル名を入力してください" mytitle = "ファイルを選択" mywbname = Application.InputBox(Prompt:=mymgs, Title:=mytitle) If mywbname <> "" Then Workbooks.Open Filename:="C:\Documents and Settings\○○○\デスクトップ\" & mywbname & ".xls" End If あと、InputBoxの未入力の戻り値は "False" では無く "" です >If mywbname <> "False" Then If mywbname <> "" Then こんな所でしょうか

daiettosur
質問者

お礼

なるほど! 解説の意味もゆっくりとですが理解できます。 無事にマクロがうごきました。またこれからたびたび質問に登場すると思います、よろしくお願いします。

その他の回答 (1)

  • kztk
  • ベストアンサー率53% (59/110)
回答No.1

mywbnameには拡張子は入れないとすると、 Workbooks.Open Filename:="C:\Documents and Settings\○○○\デスクトップ\mywbname.xls" ↓ Workbooks.Open Filename:="C:\Documents and Settings\○○○\デスクトップ\" & mywbname & ".xls" ですね。ただ、目的からすると Sub Macro1() Dim vFileName As Variant vFileName = Application.GetOpenFilename() If vFileName <> False Then Workbooks.Open Filename:=vFileName End If End Sub のほうがよいかと。GetOpenFilenameのパラメータを指定すれば、いろいろともう少し細かい制御もできますし。

daiettosur
質問者

お礼

私はまだこの構文には残念ながら行き着いていないようです。 また勉強していく過程で思い出して使わせていただきます。 こうした構文を見るだけでも非常に勉強になります。

関連するQ&A

  • VBAのデバックをどうかお助けください。

    ネットなどで調べたコードをつなぎ合わせ、なんとか下記のようなコードを作成しました。 Sub TEST2() ActiveSheet.Protect UserInterfaceOnly:=True Dim fname As String fname = Range("C3").Text ActiveSheet.Select ActiveSheet.Copy Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False Range("A1").Select ActiveWorkbook.SaveAs _ Filename:="C:\Documents and Settings\***\My Documents\ファイル\" & fname & ".xls", FileFormat:=xlNormal Dim MailSmtpServer As String Dim MailFrom As String Dim MailTo As String Dim MailSubject As String Dim MailBody As String Dim MailAddFile As Variant Dim strMSG As String ' 添付ファイルの選択 MailAddFile = "C:\Documents and Settings\***\My Documents\ファイル\" & fname & ".xls" ' 送信確認 If MsgBox("メールを送信します。" & vbCr & _ "SMTP,発信者,宛先等は正しいですか?", vbYesNo) <> vbYes Then Exit Sub MailSmtpServer = "mail.***.co.jp" ' SMTPサーバ MailFrom = "***@***.co.jp" ' 発信者 MailTo = "***@***.co.jp" ' 宛先 MailSubject = fname ' 件名 MailBody = "" ' 本文 ' メール送信(CC,BCCはブランク) strMSG = SendMailByCDO(MailSmtpServer, MailFrom, MailTo, "", "", _ MailSubject, MailBody, MailAddFile) ' 文字コードを任意に指定する場合は以下のようにします。 ' strMSG = SendMailByCDO(MailSmtpServer, MailFrom, MailTo, "", "", _ MailSubject, MailBody, MailAddFile, cdoISO_2022_JP) If strMSG <> "OK" Then MsgBox Mid(strMSG, 3) End Sub しかし、このようなエラーがでました。’宛先等は正しいですか?’のメッセージのあとです。 ’2147024864プロセスはファイルにアクセスできません’。 ところで私がやりたいことは、(1)作成したエクセルの("C3").Textをファイル名にして、アクティブシートを(値のみ貼り付けして)保存し、(2)その作成されたファイルを添付してメールで送付する。ということです。 (2)のどこかで失敗しているものと思われますが、どこを直したらいいのかわかりません。 ここまで自分でできただけでも奇跡的なので、これ以上、どうしてよいか全くわからず。。 不足の情報があれば補足いたしますのでどうぞお願いいたします。

  • シートの選択表示が、正常にできない

    excel2007でマクロ作成中の初心者です。 困ってます助けてください。 現在、Sheets("合計表")というシートがアクティブになっています。 そして、 Private Sub CommandButton4_Click() Sheets("単価表").Select End Sub のコードを実行すると、Sheets("単価表")というシートがアクティブになります。 ところが、これに MsgBoxをつけると -------------------------------------- Private Sub CommandButton4_Click() Sheets("単価表").Select Dim myBtn As Integer Dim myMsg As String, myTitle As String myMsg = "単価表を編集しますか?" myTitle = "単価表の確認" myBtn = MsgBox(myMsg, vbYesNo + vbExclamation, myTitle) If myBtn = vbYes Then ’ 単価表の編集 Sheets("単価表").Select End If End Sub --------------------------------- Sheets("合計表")というシートが表示されたままで、メッセジボタンが表示され、Sheets("単価表")に変更されません。 そして、Noボタンを押すと、はじめて、Sheets("単価表").が表示されます。 そこで、最初に Sheets("単価表")が表示されてから、Msgボタンが表示されるように したいのです。どうコードをかえたらいいでしょうか。

  • VBAを使って名前をつけて保存をしたい(2)

    Sub 名前を付けて保存() Dim wSeq As String Dim wStr As String Dim Flnm As String Dim wFlnm As String ' Sheets("データー").Select Range("C3").Select ActiveWorkbook.Save Flnm = "\\Jooo\センタ\AA\CC" & Format(Date, "【mmdd】") & ".xls" If Flnm = "False" Then Exit Sub End If ' wSeq = 0 ExitFlg = False wFlnm = Flnm Do While ExitFlg = False If Dir(Flnm) <> "" Then '存在したら、連番を加算 wSeq = wSeq + 1 wStr = "(" & wSeq & ")" Flnm = Left(wFlnm, Len(wFlnm) - 4) & wStr & ".xls" Else '存在しない時、保存 ActiveWorkbook.SaveAs Filename:=Flnm ExitFlg = True End If Loop End Sub 先日回答者の方から上記コードを教えてもらい助かっているんですが、少し不都合でてきまして、上記を実行すると最初にCC【1022】という名前でフォルダに保存され、二回目に実行するとCC【1022】(1)という名前で同じフォルダに保存され、三回目に実行するとCC【1022】(2)というように連番で同じフォルダに保存されるんですが、一番最初に保存されたCC【1022】を削除して(どんどんBookが溜まっていくのを防ぐ為)四回目に実行すると【1022】(3)ではなく最初のCC【1022】の名前で保存されてしまいます。【1022】を削除してもCC【1022】(3)で保存されるようにするには、コードをどの様にかえたらいいでしょうか?

  • VBAでExcelのセルの一覧からファイル名の変更が

    こんにちは。会社で大量のファイル名を変更していますが、Excelで一覧からを変更できれば能率的なので作っていますが、困っています。下記のものです。 Sub リネーム() Dim i As Long  Dim NEWファイル As String  Dim OLDファイル As String  Dim パス As String For i = 1 To Range("B65536").End(xlUp).Row パス = Cells(2, 1).Value OLDファイル = パス & Cells(i, 2).Value NEWファイル = パス & Cells(i, 3).Value If Dir(OLDファイル) <> "" Then Name OLDファイル As NEWファイル End If Next i End Sub ※A2にはC:\Documents and Settings\M.Co,\デスクトップ\リネームと入っています。B1には変更前の001.jpg、C1には変更するa-1.jpgとファイル名が入っています。実行してもファイル名は変更されません。エラーもでません。よろしくお願いします。

  • vba ワークシートを変数を用いて開くには

    初歩的な質問ですが、 ワークシートの書式が新しくなったことで、書き換えをすることになりました。 現在のエクセルファイルから、新しいエクセルファイルへ、セルの値を参照しながら VBAにて作業をしたいのですが、 Sub changesheet() Dim iname As String Dim wbname As String iname = InputBox("ブック名を入力", "対象ブックを入力") wbname = "シート2012(" & iname & ").xls" ActiveSheet.Range("P4").Value = Workbooks(wbname).Worksheets("Sheet1").Range("P4").Value End Sub この記載で実行すると、インデックスが有効範囲にありません とエラーになってしまいます。 変数(inputbox)を用いたセルの参照はどのように記述すればよろしいでしょうか? よろしくお願いします。

  • VBAに関して

    VBA超初心者の者ですが、ある一つのシートにいくつかの別のファイルを開いて順にコピーして貼り付けていくというプログラムを作成したいと思っています。 Sub naka() Dim k As Integer Dim r As String k = InputBox("ファイル数を記入してください") r = InputBox("範囲を指定してください") Call s1(k, r) End Sub Sub s1(i As Integer, rangearea As String) Dim v As Integer Dim x As String For v = 1 To i Dim OpenFileName As String With OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls") ThisWorkbook.Sheets(1).Range("rangearea").Copy ActiveSheet.Range("1+(rangearea.rows.count*(v-1)),1").PasteSpecial End With Next v End Sub こんな感じでかいてみたものの全く異なったものをかいているようです。同じフォルダ内にコピーするファイルが存在しているものと仮定していますが、マイ ドキュメント内のファイルとしたいです。コピーすべきシートは1としています。大変分かりづらい文章ですが、おかしい部分の指摘、見本等示していただけたらありがたいです。

  • (VBA)特定のシートのみを名前を付けて保存

    Excel2003です。 数シートあるうちの特定のシートのみを別のbookとして「名前を付けて保存」する下記のコードを書きました。一応うまく動くのですが、実はこの特定のシートには行の非表示部分があります。しかし、下記のコードではもちろん非表示部分も開かれた状態で保存がされますよね。 この非表示の状態で保存するにはどのようにすればよいのでしょうか? 【以下現在のコードです】 ------------------------------------------------ Sub 名前を付けて保存() '報告書を"名前を付けて保存" Sheets("報告書").Select Dim 既定ファイル名 As String Dim 保存ファイル名 As Variant 既定ファイル名 = "報告書" 保存ファイル名 = Application.GetSaveAsFilename(既定ファイル名, "Excel ブック(*.xls),*.xls") If 保存ファイル名 = False Then MsgBox "保存は中止されました。" Else With ThisWorkbook.ActiveSheet Workbooks.Add .Cells.Copy ActiveSheet.Range("A1") ActiveWorkbook.SaveAs 保存ファイル名, xlNormal ActiveWorkbook.Close False End With Sheets("報告書").Select Range("A1").Select MsgBox "報告書を作成しました。" End If End Sub ----------------------------------------------------

  • VBAでわからなくなってしまったので質問します。

    VBAでわからなくなってしまったので質問します。 初心者なのですが、下記の問題にあたってしまい困っています。 製品Aと製品B~xまでEXCEL2007で表を作ってあります。 A~xまで同じVBA構文を使っていますが、 Aは名前を付けて保存すると 製品名A2456【0506】と製品名+コード番号+年月になります。 しかし、B~xは製品名B~Xのみがファイル名になってしまいます。 構文A~xともRangeの参照以外共通で下記です。 Sub 最終保存() Dim wSeq As String Dim wStr As String Dim Flnm As String Dim wFlnm As String ' Flnm = "C:\Documents and Settings\user\My Documents\受検ファイル\受検済み\" '←保存先フォルダ Flnm = Flnm & Range("B11") & Range("G20") & Format(Range("B6"), "【mmdd】") '←保存ファイル名 Flnm = Application.GetSaveAsFilename(InitialFileName:=Flnm, _ filefilter:="Excel ファイル (*.xlsx), *.xlsx", Title:="名前を付けて保存") If Flnm = "False" Then Exit Sub End If ' wSeq = 0 ExitFlg = False wFlnm = Flnm Do While ExitFlg = False If Dir(Flnm) <> "" Then '存在したら、連番を加算 wSeq = wSeq + 1 wStr = "(" & wSeq & ")" Flnm = Left(wFlnm, Len(wFlnm) - 4) & wStr & ".xlsx" Else '存在しない時、保存 ActiveWorkbook.SaveAs Filename:=Flnm, FileFormat:=xlOpenXMLWorkbook ExitFlg = True End If Loop End Sub Rangeの「B11」が製品名、「G20」がコード番号、「B6」が2010年5月○日という日付になっています。 なお、最初のRange("B11")を取り除くとコード+日付がファイル名になります。 なぜ、製品Aは出来てB~xが出来ないのか分かりません。 アドバイスお願いします。

  • エクセル マクロ

    お世話になります 在庫シ-トにC8品番 D8に仕入れ先...M8に金額とあり C9-M9(以下デ-タ-がある行)までをオ-トフィルタ-で摘出し もし C列が1ならその行すべてを 販売済シ-トのC9-M9(以下デ-タ-がある行)に貼り付けたいのですが また、保存して次回開いた時、同じ作業をして販売済シ-トの 最終行の1行下からデ-タ-を貼り付けたいのですが Sub Macro1() Dim I As Long With Worksheets("在庫").Range("B8") Dim mybtn As Integer Dim mymsg As String, mytitle As String mymsg = "全ての最終行は行は一致していますか?" mytitle = "[B]列から[N]列の確認" mybtn = MsgBox(mymsg, vbOKCancel + vbExclamation, mytitle) If mybtn = vbCancel Then End If .AutoFilter Field:=2, Criteria1:="1" .CurrentRegion.SpecialCells(xlVisible).Copy Worksheets("販売済").Range("c65536").End(xlUp).Offset(1, 0).Paste End With For I = 1 To 4 Worksheets("販売済").Columns(I).ColumnWidth = _ Worksheets("在庫").Columns(I).ColumnWidth End Sub 宜しくお願い致します

  • VBA 保存

    保存ボタンを作成してファイルに飛ぶように させていますが…どうしてもエラーになります! エラー表示内容> 実行時エラー1004 シートの名前を他のシート、Visual Basicで参照される オブジェクト ライブラリまたは ワークシートと同じ名前に変更することはできません。 下記は実際の記述です。 Private Sub 保存_Click() Dim FileName As String Dim FileExt As String Dim BkName As String Dim OldWkbook As Workbook Dim NewWkbook As Workbook Const StName1 As String = "計画 グラフ" Const StName2 As String = "ケア一覧" ' Application.DisplayAlerts = False Set OldWkbook = ActiveWorkbook ' 'ファイル名を取得 BkName = OldWkbook.Sheets(StName1).Range("D1").Value FileName = BkName & Format(Now, "yyyy-mm-dd") & ".XLS" ' FileName = InputBox(FileName & "と言う名前で保存します" & vbCr & "よろしければこのままOKをクリックしてください", "保存ファイル名の確認", FileName) If FileName = "" Then Exit Sub Else If Right(FileName, 4) <> ".XLS" Then MsgBox "ファイル名が異常です。" Exit Sub End If End If ' OldWkbook.Sheets(Array(StName1, StName2)).Copy Set NewWkbook = ActiveWorkbook For wIx = 1 To NewWkbook.Sheets(1).Shapes.Count NewWkbook.Sheets(1).Shapes(1).Delete '←シート1のボタンを削除 Next NewWkbook.Sheets(1).Name = StName1 NewWkbook.Sheets(2).Name = StName2 ' FileName = "D:\看護計画保存\" & FileName ' If Dir(FileName) <> "" Then '##ファイルが既に存在する If MsgBox("既に指定のファイルが存在します。 置き換えますか?", vbOKCancel, "置き換えの確認") = vbCancel Then NewWkbook.Close savechanges:=False '##保存せずに終了 Exit Sub End If '##指定ファイル置き換え保存 NewWkbook.SaveAs FileName:=FileName Else '##ファイルを新規保存 NewWkbook.SaveAs FileName:=FileName End If ' NewWkbook.Close savechanges:=False Application.DisplayAlerts = True End Sub

専門家に質問してみよう