• ベストアンサー

VBAでユーザーに別ファイルのシートを選ばせたい場合

エクセル2000です。 マクロを記載したBOOKを開いたままで、ユーザーに作業の対象とするファイルを開かせ、その中の対象とするファイルを選ばせたら次のマクロに移りたいのですが、以下のマクロですと開いたらすぐ実行されてしまいます。 開いてからユーザーがシートをアクティブにするまで実行を止めるにはどうしたらよいのでしょうか? BOOKを開かせて一旦マクロを終了し、マクロを記載したBOOKでまた別のボタンを押させるというのなら思いつくのですが・・・。 Sub test01() MsgBox "対象のエクセルファイルを開いてください。" _ & vbCr & "開いたら該当のシートをアクティブにして下さい。", , " " If Application.Dialogs(xlDialogOpen).Show = False Then MsgBox "キャンセルされました。", , "( ̄ロ ̄;)!!" Exit Sub End If Call 次のマクロ End Sub

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

  • ベストアンサー
  • masa_019
  • ベストアンサー率61% (121/197)
回答No.4

こんにちは。 前回、お役に立てなかったので・・・。 元のブックに戻らなくても良いように、コマンドバーのボタンを利用してはどうでしょう? シートやブックを切り替えても、常に画面上に表示しておけますし、表示場所も自由に制御できます。 merlionXXさんのコードに、ちょっと付け加えさせてもらいますが、 Sub 開始() Dim MyBar As CommandBar      '追加 Dim MyBtn As CommandBarButton   '追加 MsgBox "対象のファイルを開いてください。" _ & vbCr & "開いたら該当のシートを選択してください。" _ & vbCr & "" _ & vbCr & "再度このファイルに戻り「決定ボタン」を押して下さい。", , " 対象確認" If Application.Dialogs(xlDialogOpen).Show = False Then MsgBox "キャンセルされました。", , "( ̄ロ ̄;)!!" ThisWorkbook.Sheets("Sheet1").Range("A1").ID = "" Exit Sub Else ThisWorkbook.Sheets("Sheet1").Range("A1").ID = ActiveWorkbook.Name '******************************** ここから On Error Resume Next     Application.CommandBars("MyBar").Delete On Error GoTo 0 Set MyBar = Application.CommandBars.Add("MyBar", msoBarFloating, False, True) With MyBar Set MyBtn = .Controls.Add(msoControlButton, , , , True) With MyBtn .Style = msoButtonCaption .Caption = "決定" .OnAction = "決定" End With .Visible = True End With Set MyBtn = Nothing Set MyBar = Nothing     '******************************** ここまで End If End Sub シート上に現れる"決定ボタン"をクリックすることで、Sub 決定()を走らせることができます。 サンプルでは、浮動状態のツールバーを作り、ボタンを配置しておりますが、状況に合わせて右クリックメニューに追加するなどの応用ができます。

merlionXX
質問者

お礼

masa_019さま、先日は有難うございました。 コマンドバーのボタンって初めて見ました! こういうことが出来るんですね、驚きです。 さっそくやってみましたところ、期待通りの働きです。 有難うございます。 甘えついでにご教示いただければ幸いなのですが、このボタンを押し、「決定」マクロが作動したら、×を押さなくともボタンが自動的に消えるようにするにはどうしたらよいのでしょうか?

merlionXX
質問者

補足

いろいろやってみましたが、消し方は、 Sub 決定() MsgBox ActiveSheet.Name Application.CommandBars("MyBar").Delete End Sub でいいのですね?

その他の回答 (8)

  • myRange
  • ベストアンサー率71% (339/472)
回答No.9

こんにちは、エキスパートさん。 >Userformを使う場合、ひらいたBOOKではないことがわかり >キャンセルする場合はどのようにしたらよいのでしょうか? >右上の×をクリックしても、「次のマクロ」が実行されてしまうようです。 そこら辺りのことを前回答では 「流れだけ分かればいいということで少し手を抜いてます」 という文言で表現しておりまする。(^^;;; 今回のマクロは他人にも使用させるわけですから、少なくとも (1)お礼のコメントにもあったように、ブック選択のミス (2)該当シートを決定する前に、開いたブックを閉じてしまった (3)該当シートの決定ミス などの対処を考慮に入れるべきだと考えます。 (UserForm使用の場合) (1)は仰るように、ブック再選択用にCommandButton2を配置 (2)は、開いたブックは手動では閉じれないようにする    (これにはコードは不要) (3)は、決定ボタンをクリックしたら、再度確認メッセージを出す こんなところでしょうか。 ただ(2)を除いては、ユーザーに無視されてしまえば防ぎようがありませんが。。 で、上記を考慮にいれたコード '--------- 標準モジュール -----------------------   Public Flag As Boolean   '●再選択フラグ '-------------------------------- Sub test01()  Dim MsgResult As Integer  MsgBox "OKボタンをクリックすると" & vbLf & _     "ファイル選択画面が表示されますので" & vbLf & _     "対象ファイルを選択してください"      SelectBook:  If Application.Dialogs(xlDialogOpen).Show = False Then    MsgBox "キャンセルされました。", , "( ̄ロ ̄;)!!"    Exit Sub  End If  Flag = False  UserForm1.Show  If Flag = True Then GoTo SelectBook  '●DialogOpenに戻る    Call 次のマクロ End Sub '---------------------------------------- Sub 次のマクロ()   MsgBox "次のマクロ実行するよ" End Sub '----------------------------------------- '-------以下は、UserForm --------------------------------- Private Sub UserForm_Initialize()  Dim i As Integer  UserForm1.Caption = "シート選択"  CommandButton1.Caption = "このシートでOK"  CommandButton2.Caption = "別のブックを再選択"    ListBox1.Clear  For i = 1 To Sheets.Count    ListBox1.AddItem Sheets(i).Name    If ActiveSheet.Name = Sheets(i).Name Then      ListBox1.ListIndex = i - 1    End If  Next i End Sub '-----UserFormの×ボタンはダメ!の処理 --------- Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)  If CloseMode = 0 Then    Cancel = True    MsgBox "Don't Click Me!  ", vbCritical, " Caution"  End If End Sub '--------------------------------------------- Private Sub ListBox1_Change()   Sheets(ListBox1.List(ListBox1.ListIndex)).Select End Sub '--------------------------------------------- Private Sub CommandButton1_Click()   Unload UserForm1 End Sub '--------ブック再選択処理--------------------- Private Sub CommandButton2_Click()   Flag = True   ActiveWorkbook.Close False   Unload UserForm1 End Sub '--------------------------------------------- シート決定ミスの確認メッセージは抜いてます。 また、”Call 次のマクロ”の位置は 上記コードでは、以前の位置でもいいし 質問者の考えた、CommandButton1のところでもOKです。   ●別案● UserFormをモードレスで開くと既出の回答のように シートを直接扱えますのでListBoxは不要になります。 もちろんコードはちょと違いますが。。。   何れにしろ色んな方法があり面白いですね。 そしてそれをひとつひとつ確かめているエキスパートさんもたいしたものです。 以上です。  

merlionXX
質問者

お礼

ありがとうございます。 かなり奥が深そうですね。 DialogSheetとはぜんぜん使い方がちがい面食らってばかりです。 これまでUserformはまったく縁が無かったのでこれを機会に勉強してみたいと思います。 ありがとうございました。

  • NNAQ
  • ベストアンサー率56% (104/184)
回答No.8

#7 です。 全然関係ないプロシージャでも、おかしなコードがあるとそのエラーが出るようです。 VBE の[デバッグ]-[VBAProjectのコンパイル] を、やってみてください。 それでも動かなければ、分かりかねます。すいません。

merlionXX
質問者

お礼

多分、新たに開いてアクティブになったBOOKのモジュールにマクロが存在しないせいではないかと推測し、 .Callback = "AssistantSample2" となっている3箇所に .Callback = "アニメTEST.xls!AssistantSample2" とマクロのあるBOOK名を付け加えて見ました。 無事動きました。 ありがとうございます。

merlionXX
質問者

補足

追伸です。 アニメTEST.xls はご教示のマクロをかいたBOOKですが、BOOK名をコードに書かず、 .Callback = ThisWorkbook.Name & "!AssistantSample2" とした方が名前の変更にも対応できてベターですね。

  • NNAQ
  • ベストアンサー率56% (104/184)
回答No.7

いろいろなアイデアが出てますが、さらに別案で、 Officeアシスタントを使ってもいいなら、ユーザーと対話的に作業を進められます。 Sub AssistantSample1() With Assistant .On = True .Visible = True .Filename = "saeko.acs" With .NewBalloon .Heading = "対象確認" .Text = "対象のファイルを開いてください。" .Button = msoButtonSetOK .Show End With If Application.Dialogs(xlDialogOpen).Show = False Then With .NewBalloon .Heading = "( ̄ロ ̄;)!!" .Text = "キャンセルされました。" .Button = msoButtonSetOK .Show End With Exit Sub Else .animation = msoAnimationCheckingSomething With .NewBalloon .Heading = "シート選択" .Text = "開いたら該当のシートを選択して[OK] をクリックしてください。" .Button = msoButtonSetOK .Mode = msoModeModeless .Callback = "AssistantSample2" .Show End With End If End With End Sub Sub AssistantSample2(bln As Balloon, lbtn As Long, lPriv As Long) bln.Close With Assistant Select Case lbtn '=クリックされたボタン Case msoBalloonButtonOK '[OK]ボタン .animation = msoAnimationWorkingAtSomething With .NewBalloon .Heading = "( ̄∇ ̄) ? " .Text = "アクティブシートのデータを取得します。" .Icon = msoIconAlertQuery .Button = msoButtonSetYesNoCancel .Mode = msoModeModeless .Callback = "AssistantSample2" .Show End With Case msoBalloonButtonYes '[はい]ボタン .animation = msoAnimationGestureUp Call 次のマクロ '.On = False 'アシスタントを消す Case msoBalloonButtonNo '[いいえ]ボタン .animation = msoAnimationCheckingSomething With .NewBalloon .Heading = "シート選択" .Text = "シートを選択しなおして[OK] をクリックしてください。" .Button = msoButtonSetOK .Mode = msoModeModeless .Callback = "AssistantSample2" .Show End With Case msoBalloonButtonCancel '[キャンセル]ボタン .animation = msoAnimationGetWizardy With .NewBalloon .Heading = "/(^o^)\" .Text = "中止します。" .Button = msoButtonSetOK .Show End With '.On = False 'アシスタントを消す End Select End With End Sub Sub 次のマクロ() MsgBox "次のマクロ" End Sub Animationを使ったり、半分お遊びなので、 ヒマあったら実行してみてください。

merlionXX
質問者

お礼

ありがとうございました。 アシスタントのアニメーションは使ったことがありませんでした。 面白そうなのでさっそく試してみました。 ところが、対象のBOOKを開いてからOKすると 「マクロ、AssistantSample2がみあたりません」というエラーになってしまいます。

  • masa_019
  • ベストアンサー率61% (121/197)
回答No.6

こんにちは。 期待に沿えたようで、良かったです。 消し方はその通りですが、念のため On Error でトラップしておいた方がいいかも。 ちなみに、コマンドバーを×で消す動作は、コマンドバーのVisibleプロパティをFalseに設定するのと同じで、Deleteは ツール - ユーザー設定 から削除する動作になります。

merlionXX
質問者

お礼

ご丁寧にありがとうございました。 助かりました。

  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.5

今日わ ファイルを開いて、すぐに実行しないようにするには、 Application.OnTime を使ったらどうでしょう。 Else ThisWorkbook.Sheets("Sheet1").Range("A1").ID = ActiveWorkbook.Name 呼び出し時間 = Now + TimeValue("00:00:08") Application.OnTime 呼び出し時間, "決定" End If End Sub

merlionXX
質問者

お礼

有難うございます。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

簡易的な方法としては、Application.InputBoxメソッドが考えられます。 シートタブではなく、必ずセルを選択してもらう必要がありますが。 Sub test1()   Dim wb As Workbook   Dim r As Range   Dim x        x = Application.GetOpenFilename("ExcelFile,*.xls")   If VarType(x) = vbBoolean Then Exit Sub   On Error Resume Next   Set wb = Workbooks.Open(CStr(x))   On Error GoTo 0   If wb Is Nothing Then     MsgBox "openメソッド失敗"   Else     On Error Resume Next     Set r = Application.InputBox("該当シートの適当なセルを選択", Type:=8)     On Error GoTo 0     If Not r Is Nothing Then       r.Worksheet.Activate       Call msg1     End If   End If      Set r = Nothing   Set wb = Nothing End Sub Sub msg1()   MsgBox ActiveSheet.Name End Sub 他にはWshShellのPopupメソッドを使う方法もあったりします。 Sub test2()   Dim wb As Workbook   Dim x        x = Application.GetOpenFilename("ExcelFile,*.xls")   If VarType(x) = vbBoolean Then Exit Sub   On Error Resume Next   Set wb = Workbooks.Open(CStr(x))   On Error GoTo 0   If wb Is Nothing Then     MsgBox "openメソッド失敗"   Else     Application.OnTime Now, "msg2"     Set wb = Nothing   End If End Sub Sub msg2()   Dim x As Long      Application.Cursor = xlNorthwestArrow   x = CreateObject("WScript.Shell") _     .Popup("シートを選択してください.", , "title", vbOKCancel Or vbSystemModal)   Application.Cursor = xlDefault   If x = 1 Then     MsgBox ActiveSheet.Name   End If End Sub #私の環境(xp/2003)ではOnTimeメソッド経由でないと不安定な感じでしたので入れてますが #本来はダイレクトにいけるかも。

merlionXX
質問者

お礼

ありがとうございます。 こういうやり方もあるんですね、とても勉強になります。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.2

こんにちは、エキスパートさん。 毎日色んなことやってるのですねぃ。(^^;;; シートを確認しながらということであれば、 エキスパートさんもお得意のUserFormがいいかも。 ListBoxとCommandButtonをひとつずつ乗せてるUserFormを用意して 以下のコードを実行してみてください。   '--------- 標準モジュール ----------------------- Sub test01()  MsgBox "OKボタンをクリックすると" & vbLf & _     "ファイル選択画面が表示されますので" & vbLf & _     "対象ファイルを選択してください"  If Application.Dialogs(xlDialogOpen).Show = False Then    MsgBox "キャンセルされました。", , "( ̄ロ ̄;)!!"    Exit Sub  End If  UserForm1.Show    Call 次のマクロ End Sub '---------------------------------------- Sub 次のマクロ()   MsgBox ActiveSheet.name End Sub '----------------------------------------- '-------以下は、UserForm ------------------------ Private Sub UserForm_Initialize()  Dim i As Integer  ListBox1.Clear  For i = 1 To Sheets.Count    ListBox1.AddItem Sheets(i).Name    If ActiveSheet.Name = Sheets(i).Name Then      ListBox1.ListIndex = i - 1    End If  Next i End Sub '--------------------------------------------- Private Sub ListBox1_Change()   Sheets(ListBox1.List(ListBox1.ListIndex)).Select End Sub '--------------------------------------------- Private Sub CommandButton1_Click()   Unload UserForm1 End Sub '---------------------------------------------- UserFormのListBoxにシート名を表示させ シート名をクリックするたびに選択シートをアクティブにし 該当シートであれば、OKボタン 流れだけ分かればいいということで少し手を抜いてます。。 昨日、洗車したのですが、今朝もうっすらと灰が。。。 これがなければいいところなのですがねぃ。(^^;;; 以上です。  

merlionXX
質問者

お礼

昨日はバタバタしておりお礼がおそくなりました。 なるほどUserFormを使えばいいわけですか。 実は、いつも旧式のDialogboxでお茶を濁してばかりで、UserFormって一度も使ったことがないんです。 試したら上手くいきました! 有難うございます。 で、Userformを使う場合、ひらいたBOOKではないことがわかり、キャンセルする場合はどのようにしたらよいのでしょうか? 右上の×をクリックしても、「次のマクロ」が実行されてしまうようです。

merlionXX
質問者

補足

いろいろ試してみました。 キャンセル対応として以下のようにしてみました。 標準モジュール Sub test01() から 「Call 次のマクロ」 の文言を削除 UserForm UserFormにコマンドボタンをもう一つ追加(CommandButton2) Private Sub CommandButton1_Click() Unload UserForm1 Call 次のマクロ End Sub に修正 Private Sub CommandButton2_Click() Unload UserForm1 End Sub をあらたに追加。 これで正しいでしょうか?

回答No.1

マクロの実行中にシートをユーザに直接選択させることはできないでしょう。 代わりに以下のようにしてはどうでしょう。 Sub test01() Dim i As Integer, sht_no As Integer Dim msg As String MsgBox "対象のエクセルファイルを開いてください。" If Not Application.Dialogs(xlDialogOpen).Show Then Exit Sub 'Inputbox用のメッセージを作成 For i = 1 To ActiveWorkbook.Worksheets.Count msg = msg & i & ":" & ActiveWorkbook.Worksheets(i).Name & vbCrLf Next 'ユーザにActiveにするシート番号を選択させる Do While sht_no < 1 Or sht_no > ActiveWorkbook.Worksheets.Count sht_no = Val(InputBox("■下記から対象シートの番号を選択してください" & vbCrLf & msg)) Loop ActiveWorkbook.Worksheets(sht_no).Activate Call 次のマクロ End Sub

merlionXX
質問者

お礼

cistronezkさま、さっそくありがとうございます。 InputBoxを使う手は思いつきませんでした。 ただ、これだと対象とするシートを視認することは出来ないので、ユーザーはシート名だけで判断しなければいけませんよね。そこがちょっと・・・。 現在は以下のようにやっているのです。 Sub 開始() MsgBox "対象のファイルを開いてください。" _ & vbCr & "開いたら該当のシートを選択してください。" _ & vbCr & "" _ & vbCr & "再度このファイルに戻り「決定ボタン」を押して下さい。", , " 対象確認" If Application.Dialogs(xlDialogOpen).Show = False Then MsgBox "キャンセルされました。", , "( ̄ロ ̄;)!!" ThisWorkbook.Sheets("Sheet1").Range("A1").ID = "" Exit Sub Else ThisWorkbook.Sheets("Sheet1").Range("A1").ID = ActiveWorkbook.Name End If End Sub Sub 決定() x = ThisWorkbook.Sheets("Sheet1").Range("A1").ID If x = "" Then MsgBox "対象ファイルが開かれていません!", , "Σ( ̄ロ ̄lll) " Exit Sub End If Workbooks(x).Activate If MsgBox("このシートのデータを取得します。", vbYesNo + vbQuestion, "( ̄∇ ̄) ? ") = vbYes Then Call 次のマクロ Else MsgBox "中止します。", , "/(^o^)\" End If End Sub これだと見て確認できますから。 ただ、一旦もとのBOOKに戻らなければボタンを押せないのが気に入りません。 ボタンを押す代わりに何らかの方法でSub決定を作動できればいいと思うのですが、方法がわかりません。

関連するQ&A

  • Excel VBA 違うxlsファイルの指定したシートを開く処理

    Excel VBAで違うExcelファイルの指定したシートを開きたいのですが、 うまくいきません。現在のコードは、 *フォーム* Private Sub CB1_Click() Dim A As Integer A = MsgBox("データ展開する?", 4, "データ展開?") If A = 6 Then INPORT.FILE_OPEN1 End If End Sub *INPORTモジュール* Sub FILE_OPEN1()  FILE_OPEN8 End Sub Sub FILE_OPEN8() Dim fnames As String fnames = fnames1 Workbooks.Open Filename:=fnames ***ここでしょうか?.Sheet("")と指定しても出来ません*** End Sub Function fnames1() As Variant fnames1 = Application.GetOpenFilename( _ Title:="ファイルを開く", _ FILEFILTER:="エクセルファイル (*.xls), *.xls") If fnames1 = False Then MsgBox ("ファイルを開けませんでした。" & Chr$(13) & _ "もう一度やり直して下さい。") End End If End Function また、指定する事が出来たら、選択したシートを現在のブックにコピーもしたいのですが、どの様にすればよいでしょうか? よろしくお願いします。

  • エクセルVBAで、作業対象を全ワークシートか選択シートかを切り替えたい

    エクセル2000です。 VBAで、作業対象を全部のワークシートか選択されたシートかを任意で切り替えたいのです。 ためしに無理とは思いながら以下のように作ってみましたが、当然のようにエラーになります。 どうかお知恵をお貸しくださいませ。 お願い致します<(_ _)> Sub test() sc = ThisWorkbook.Worksheets.Count ssc = ActiveWindow.SelectedSheets.Count If sc <> ssc Then ans2 = MsgBox(ssc & " 枚のシートだけでいいんですね?" _ & vbCr & "" _ & vbCr & "もし全部のシート(" & sc & "枚)を対象にするなら" _ & vbCr & "いいえを選択してください。", vbYesNo + vbQuestion, " o(^-^)o") ts = IIf(ans = vbNo, Worksheets, ActiveWindow.SelectedSheets)'ここでエラー End If For Each sh In ts sh.Activate sh.Cells(1, 1).Value = sh.Name Next sh End Sub

  • 開いているシートをチェックする

    いつもこちらでお世話になってます。 VBAで、ひとつのブックの開いているシートをチェックする方法を教えてください。 "sheet1" "sheet2"  "sheet3" と同じブックにあるとし、 "sheet1"を開いてマクロを実行したら、 「シート1です」とメッセージボックスを出し、"F4"を選択。 "sheet2"を開いてマクロを実行したら、 「シート2です」とメッセージボックスを出し、"G4"を選択。 "sheet3"を開いてマクロを実行したら、 何もしない。 というようなコードをどうすればいいいのでしょうか? 自分なりに試してみたのは、以下のようなものです。 ' Macro () If Sheets("sheet1").Activate Then MsgBox "シート1です"   Sheets("sheet1").range("f4").select End If If Sheets("sheet2").Activate Then MsgBox "シート2です" Sheets("sheet2").range("g4").select End If End Sub これだと、どのシートを開いていても、 "sheet1"が開いて、"シート1です" のメッセージが出て、OKを押すと、"F4"を選択し、そのまま "sheet2"が開いて、"シート2です" のメッセージが出て、OKを押すと、"G4"を選択してし、 "sheet2"が開いた状態になってしまいます。 今現在は、2つのマクロが別々にあります。 マクロのオプションでCtrl+半角キーを同じにしたい、と考えています。 マクロのオプションで同じ半角キーをすることはできるようなのですが、 そうすると、Private Sub Worksheet_Activateで "sheet1"が開いたときは"E4"を選択するようにしているので、デバックが出てしまいます。 どのようにすればいいのでしょうか?

  • VBAで書き込みパスワードを解除して開く

    VBAでの作成経験が浅くわからないので、教えてください。 Excel2010のVBAを作成しております。 VBAで”ファイルを開く”ダイアログを表示し、ユーザが指定したファイルのパスワードの保護をマクロの中で解除してファイルを開きたいと思い作成しました。 myMB = Application.Dialogs(xlDialogOpen).Show(arg6:=myPassword) If myMB = False Then Exit Sub End If   ※myPasswordはユーザが開くファイルに使用するパスワード この方法ですと、パスワードを入れるダイアログが表示されてしまいます。 どうしたら、パスワードをユーザが入力することなく、マクロを実行することが できるのでしょうか?

  • Excelのユーザーフォームで別のファイルに転記

    Excel2007です。 マクロを含んだデータファイルがあるのですが、マクロブックとデータブックは分割した方がよいと言われて今分割の方法を試しています。 「マクロブック.xlsm」にマクロを記述し、「商品在庫Data.xlsm」にデータが格納されています。 (まだ試験中で完全に分割できていないのでデータブックもxlsm形式ですが) マクロブックのユーザーフォームから「商品在庫Data.xlsm」ファイルの「商品マスタ」というシートに転記したいのですが、どうやっても「商品在庫Data.xlsm」で「商品マスタ」シートを指定して転記できません。 ユーザーフォームのコードは下記のような内容です。 「HinTouroku」コマンドボタンを押した時に商品マスタシートに内容が転記されるようになっています。 Option Explicit Private Sub HinTouroku_Click() '商品登録 Dim lRow As Long Dim s1 As String, s2 As String Dim Ctrl As Control With Workbooks("商品在庫Data.xlsm") Worksheets ("商品マスタ") lRow = .Range("A" & Rows.Count).End(xlUp).Row s1 = .Cells(lRow, "A").Value s2 = txtHinId.Text If s1 = s2 Then MsgBox "商品IDが重複しています" Exit Sub End If lRow = lRow + 1 .Cells(lRow, "a").Value = txtHinId.Text .Cells(lRow, "b").Value = txtSyohinmei.Text .Cells(lRow, "c").Value = txtHinRyaku.Text End With For Each Ctrl In Me.Controls If Ctrl.Name Like "txt*" Then Ctrl.Value = "" End If Next End Sub Private Sub TourokuClr_Click() '入力フォームのクリア Dim myCtrl As Control For Each myCtrl In Controls If TypeName(myCtrl) = "TextBox" Then _ myCtrl.Value = vbNullString Next End Sub Private Sub TourokuCls_Click() 'フォームを閉じる Unload Me End Sub http://vbaexcel.seesaa.net/category/7604114-2.html このサイトを参考にしながら書いてみたのですがどうしてもシートの指定ができず… どのように記述すればよいのでしょうか?

  • エクセルのマクロでファイルを開く

    エクセルの「ファイルを開く」ダイアログボックスを使用してファイルを開き、その開いたファイルに対してとあるマクロを実行させたいと思っています。 エクセルの「ファイルを開く」ダイアログボックスでパス取得までは理解出来たのですが、その先の処理が分かりません。 「ファイルを開く」と言うのは、「現在アクティブになっているシートにデータを貼り付けて」の処理でも構いません。 Dim Ret As Variant Ret = Application.GetOpenFilename("Excel ブック (*.xls), *.xls, テキストファイル(*.txt),*.txt") If Ret = False Then MsgBox "キャンセルが選択されました。" Exit Sub Else       'ここにRetで取得しているパスのファイルを開いて、sub_WAITのマクロを実行させたいです。 sub_WAIT.Show End If End Sub

  • シートだけを保存したいのですが?

    はじめましてマクロ初心者です。 検索しましたがわからなかったので、質問させていただきます。 保存をキャンセルすると新規ブックができてしまいます。 キャンセルした時に新規ブックを作りたくないのですが、教えてください。 Sub シート保存() Dim Answer3 Dim 既定ファイル名 As String Dim 保存ファイル名 As Variant Answer3 = MsgBox("本当に保存しますか?", vbYesNo) If Answer3 = vbYes Then Sheets("保存シート").Select Application.CutCopyMode = False Sheets("保存シート").Copy Else MsgBox ("キャンセルしました。") End If 既定ファイル名 = Range("V8") 保存ファイル名 = Application.GetSaveAsFilename(既定ファイル名) If 保存ファイル名 = False Then MsgBox "保存は中止されました。" Else ActiveWorkbook.SaveCopyAs 保存ファイル名 End If End Sub よろしくお願いします。

  • Excelユーザーフォームでシートの移動

    Excel2007です。 データを集計するためのデータブックがあり、その中に30ほどのシートがあります。 このデータ集計を別に作成したマクロブックから操作しています。 データブックは毎日その日ごとのものが作成されます。 30ほどのシートの中で、その日の集計が終わったシートを選択して、別のシート移動用ファイルに移動させるようにしたいと思い、ユーザーフォームを作成しました。 ユーザーフォームにリストボックスを置き、そこにデータブックにあるシートの一覧が表示されます。 その中で選択したシートを「移動」というコマンドボタンで指定したファイル(この場合はBool2.xlsx)に移動させようとしています。 下記のコードを書いたところ、ユーザーフォームを開いて一度移動の操作でBook2に移動するまではできたのですが、更に別のシートを移動しようとすると 「インデックスが有効範囲にありません」 のエラーが出ます。 ユーザーフォームを一旦閉じて再度開くとエラーなく移動処理できます。 また、移動処理後にリストを再取得する方法がわからなくて、既に移動したシートもリストボックスに表示されたままになります。 ユーザーフォームを閉じることなく続けて移動処理をしたいのと、移動させたものをリストボックスから削除するにはどうしたらよいでしょうか。 ’リストボックスにシート一覧を表示 Private Sub UserForm_Initialize() Dim a As Worksheet ListBox1.MultiSelect = 2 For Each a In Sheets ListBox1.AddItem a.Name Next End Sub ’Book2にシートを移動 Private Sub SheetIdou_Click() Dim i As Integer Dim v() As String Dim k As Integer With ListBox1 ReDim v(1 To .ListCount) For i = 0 To .ListCount - 1 If .Selected(i) Then k = k + 1 v(k) = .List(i) End If Next i If k = .ListCount Then MsgBox "すべてのシートを移動することはできません" Exit Sub End If End With ReDim Preserve v(1 To k) If MsgBox("以下のシートを移動しますか?" & vbLf & Join(v, "/"), vbYesNo, "確認") = vbYes Then Sheets(v).Move After:=Workbooks("Book2.xlsx").Worksheets(1) End If End Sub よろしくお願いいたします<(__)>

  • エクセルVBAシート分けしても他のシート反映しない

    エクセルのVBAで、エクセルのセル(A列)に「12345」と入力しカーソールを入力したセルに合わせ、 今回作成したマクロを実行すると「12345」の名前がついたフォルダーを 指定した場所に自動作成しハイパーリンクするVBAを作成したのですが、 作ったVBAを同じエクセルでシート分けして、シート毎に作成されるフォルダー先を変更設定しても VBAのシート1で変えた場所にしか反映されません。 シート1は「ABC」にフォルダーを作る様にしたいのでVBAのシート1の保存先を「ABC」に設定 シート2は「DEF」にフォルダーを作る様にしたいのでVBAのシート1の保存先を「DEF」に設定 上記を設定した後にエクセルのシート2でマクロ実行しても「ABC」フォルダーの中に作ってしまう。 VBAの内容が変なのでしょうか? それともエクセルの仕様なのでしょうか? エクセルのバージョンは2003です。 検索等をしても特にHITしなくて・・・ 申し訳ありませんが、解る方いらっしゃいませんでしょうか? 保存先指定は下記、VBAの編集で可能。 「wkStr = ThisWorkbook.path & "\" & ActiveCell.Value」の「"\"」のところです。 例:ABCフォルダーの場合 「wkStr = ThisWorkbook.path & "\ABC\" & ActiveCell.Value」 現在のマクロ Sub MakeHyLink() Dim wkStr As String If ActiveCell.Column <> 1 Then Exit Sub If ActiveCell.Value = "" Then MsgBox "アクティブセルは未入力、やり直し" Exit Sub End If wkStr = ThisWorkbook.path & "\" & ActiveCell.Value If Dir(wkStr, vbDirectory) = "" Then MsgBox "フォルダー:" & wkStr & vbLf & " を、作成します。" MkDir wkStr Else MsgBox "フォルダー:" & wkStr & vbLf & " は、存在します。" End If ActiveSheet.Hyperlinks.Add Anchor:=ActiveCell, Address:=wkStr End Sub

  • VBAでユーザーフォーム上に参照したファイルを開きたいのですが…

    EXCEL2003 SP3での質問です。 ユーザーフォームをVBAで作成中です。 主な機能は、対象月をコンボBOXで選択させた上で、 データ元とインプット先のファイルをテキストBOXに参照し、 実行ボタンクリックでデータ元からインプット先の該当月シートに データをコピーするといった感じです。 (データ元の該当シート内データを全てコピー&ペースト) 取り込み以降の処理はVBAを使用せずに作成しようと考えています。 質問は、取込みたいファイルの参照後の「ファイルを開いてデータをコピーする」処理がうまくいかず、 どのようにしたらよいか教えて頂けますでしょうか。 現在、以下のように記述していますが、 CommandButton3_Click()の部分の処理が分からずファイルが開けません。ご教授ください。 Private Sub CommandButton1_Click() With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "テキスト", "*.csv;*.txt", 1 If .Show = 0 Then Exit Sub Me.TextBox1.Text = .SelectedItems(1) End With End Sub Private Sub CommandButton2_Click() With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "テキスト", "*.csv;*.txt", 1 If .Show = 0 Then Exit Sub Me.TextBox2.Text = .SelectedItems(1) End With End Sub Private Sub CommandButton3_Click() Dim file_name As String If TextBox1.Text = "" Then MsgBox "ファイルが指定されていません", vbInformation ElseIf TextBox1.Text = "" Then file_name = TextBox1.Text = "" Shell "Workbooks.OpenText TextBox1.Value " End If End Sub Private Sub CommandButton4_Click() yesno = MsgBox("保存後、ファイルを閉じます。終了していいですか?", vbYesNo + vbQuestion, "Reportの終了") If yesno = vbYes Then ActiveWorkbook.Save ActiveWorkbook.Close Else End If End Sub

専門家に質問してみよう