はじめまして。Excel勉強中の者です。
Excel VBAで
マクロボタンを押した後、
ユーザーに別のファイルとシートを選択して
選択したシートをコピーするという処理をしたく
作成中です。
色々なサイトを見ながら作ってみたのですが
現在のわたしの力では
シートを手入力する処理までしか作れないのと
キャンセル後の処理がうまくできないようです。
現在は以下のようになってます。
------------------------
Sub test()
Dim ret As Boolean
Dim myPath, msg, shName As String
Dim wb_A As Workbook, Sh As Worksheet
'ファイルを選んでもらう
myPath = Application. GetOpenFilename ("Microsoft Excelブック, *.xls?")
If myPath = "False" Then Exit Sub
Set wb_A = Workbooks. Open (myPath)
For Each Sh In wb_A. Worksheets
msg = msg & Sh. Name & Chr(10)
Next
msg = msg & "シート名を入力してください"
Do
ShName = InputBox (msg, "シート選択" )
For Each Sh In wb_A. Worksheets
If shName = Sh. Name Then Flag = True
Next
If Not Flag Then shName =""
Loop While Len (shName) = 0
wb_A. Worksheets(shName). Copy before := ThisWorkbook. Sheets(1)
wb_A. Saved = True
wb_A.Close
Set wb_A = Nothing
End Sub
-----------------------
です。(誤字があったら申し訳ございません)
現在マクロは一応動くのですが
シート名を手入力するのではなく、選択できるように変更したいのと(For Eachでダイアログボックスに入れる?)
フォルダの選択をキャンセルした時に
キャンセルしましたの文言をmsgBoxで出したいのと
シートの選択をキャンセルすると、
なにか入力するまで永遠に入力欄が表示され続けるのをどうにかしたいのですが
色々工夫してもどうにもうまく処理できず
わたしの技術ではここまでが限界でした。
どうか、お力を貸していただければと思います。
よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
>UserFormを教えていただけたら嬉しいです。
先ずコードから
標準モジュールに
Option Explicit
Public Buf As String
Sub test()
Dim ret As Boolean, Flag As Boolean
Dim myPath, msg, shName As String
Dim wb_A As Workbook, Sh As Worksheet
'ファイルを選んでもらう
myPath = Application.GetOpenFilename("Microsoft Excelブック, *.xls?")
If myPath = "False" Then
MsgBox ("キャンセルしました")
Exit Sub
End If
Set wb_A = Workbooks.Open(myPath)
Buf = ""
With UserForm1
For Each Sh In ActiveWorkbook.Worksheets
.ListBox1.AddItem Sh.Name
Next
.CommandButton1.Caption = "キャンセル"
.Caption = "ワークシート選択"
.Show
End With
If Buf = "" Then
MsgBox ("シート選択がキャンセルされました")
Else
wb_A.Worksheets(Buf).Copy before:=ThisWorkbook.Sheets(1)
End If
wb_A.Saved = True
wb_A.Close
Set wb_A = Nothing
End Sub
Formモジュールに
Option Explicit
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub ListBox1_Click()
Buf = ListBox1.List(ListBox1.ListIndex) 'ワークシート名を取得
Unload Me
End Sub
UserForm1は、添付図のような感じで
いかがでしょう?
とてもわかりやすく書いていただきありがとうございます。
Formモジュールが初めてだったため理解に時間がかかりすみません。
実際に試してみたところ、UesrFormの
.ListBox1のところでコンパイルエラーが起きてしまい
メソッドまたはデータメンバーが見つかりません
と表示されてしまうのですが、どう改善したらよいのでしょうか(無知で申し訳ないです)
No.4
- 回答日時:
#2です。
ユーザーフォームは作成されたと言う事でよろしかったでしょうか
一応、参考サイト https://www.sejuku.net/blog/37407
ユーザーフォームを挿入して ツールボックスで
リストボックス と コマンドボタンを 作成します。
UserForm1やListBox1などの数字部分は、自動的に作成されますが、念のため確認してください。
>.ListBox1のところでコンパイルエラー
上のUserForm1でエラーではないので
ListBox1オブジェクト自体を取得できていない可能性が高いと思います。
一度、下記でUserForm1が表示されリストボックスとコマンドボタンが表示されるか試してください。
Sub test1()
UserForm1.Show
End Sub
ユーザーフォームについて理解しきれてませんでした。参考サイトのおかげで理解することができました。
そして、やりたかった操作ができました。
とてもわかりやすく書いていただき勉強になりました。
ありがとうございます!!
No.3
- 回答日時:
こんにちは
Formを使わなくてすむような、簡単な方法はないものかと考えてみました。
エクセルには「シート選択ダイアログ」があるので、GetOpenFilenameと同様に、これを利用できないものかと考えましたが、どうやら組み込みダイアログにはリストアップされていないようです。
「シート選択ダイアログ」を表示するのに、以下の方法をみつけましたが、戻り値が無いため、残念ながらCancelを判別することはできません。
とは言っても、シートを選択する際に十分利用できるのではと思います。
以下は、シート選択部分のみの例ですが、ご参考にでもなれば。
(アクティブなブックに対して処理されます)
' シート選択
With CommandBars.Add(Temporary:=True)
.Controls.Add(ID:=957).Execute
.Delete
End With
No.1
- 回答日時:
こんばんは、
InputBoxでは、シート選択が出来ないのでUserFormを使うのが簡単ですね
UserForm作りますか? 取り敢えずエラー対策を付け足してみました。
Sub test()
Dim ret As Boolean, Flag As Boolean
Dim myPath, msg, shName As String
Dim wb_A As Workbook, Sh As Worksheet
'ファイルを選んでもらう
myPath = Application.GetOpenFilename("Microsoft Excelブック, *.xls?")
If myPath = "False" Then
MsgBox ("キャンセルしました")
Exit Sub
End If
Set wb_A = Workbooks.Open(myPath)
For Each Sh In wb_A.Worksheets
msg = msg & Sh.Name & Chr(10)
Next
msg = msg & "シート名を入力してください"
Do
shName = InputBox(msg, "シート選択")
If shName = "" Then GoTo sheet_cancel
For Each Sh In wb_A.Worksheets
If shName = Sh.Name Then Flag = True
Next
If Not Flag Then shName = ""
Loop While Len(shName) = 0
wb_A.Worksheets(shName).Copy before:=ThisWorkbook.Sheets(1)
sheet_cancel:
If Flag = False Then MsgBox ("シート選択がキャンセルされました")
wb_A.Saved = True
wb_A.Close
Set wb_A = Nothing
End Sub
こんばんは。
遅い時間に申し訳ありません。
エラー対策ありがとうございます。
とても勉強になります…!
InputBoxだからできなかったのですね。
勉強不足でした…
もしお手数じゃなかったら、
UserFormを教えていただけたら嬉しいです。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELで複数のシートを一度に「...
-
エクセルでブック内の倍率がバ...
-
ハイパーリンクでジャンプした...
-
特定のシートのみ再計算させな...
-
エクセルで複数のシートに画像...
-
【Excel VBA】データ貼り付け先...
-
エクセル、別のシートの表をポ...
-
エクセルのシー名を二段表示に...
-
エクセルのシート連番の振り直し
-
EXCELの「シートの見出し」のフ...
-
ワークシートそのものの色を変...
-
エクセル 非表示のシートをハ...
-
EXCELの図形(テキストボックス)...
-
Wordで差し込み印刷時に表示す...
-
【ExcelVBA】マクロの入ったシ...
-
Access VBAからExcelシートの削除
-
Excel 全シート上のボタンを削...
-
特定のシート名のシートのみ除...
-
エクセルの2つのシートを並び...
-
エクセル、特定のシートにパス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELで複数のシートを一度に「...
-
エクセルでブック内の倍率がバ...
-
特定のシートのみ再計算させな...
-
エクセルで複数のシートに画像...
-
ハイパーリンクでジャンプした...
-
ワークシートそのものの色を変...
-
エクセルの2つのシートを並び...
-
【ExcelVBA】マクロの入ったシ...
-
エクセル、特定のシートにパス...
-
エクセルのシート連番の振り直し
-
EXCELの図形(テキストボックス)...
-
特定の複数のシートに同じ処理...
-
【Excel VBA】データ貼り付け先...
-
エクセルのシー名を二段表示に...
-
EXCELの「シートの見出し」のフ...
-
Accessのテーブルを既存のExcel...
-
Wordで差し込み印刷時に表示す...
-
accessへエクセルの複数のシー...
-
エクセル、別のシートの表をポ...
-
指定したシート名以外を非表示...
おすすめ情報