![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
皆様お世話になります。
昨日は一括保存をご教授していただきありがとうございました。
早速ですが今回は、チェックboxを使用してシートを選択しそれをCSV形式にて保存したいのですがどうもうまくいきません。
ご教授よろしくお願いします
Private Sub 保存_Button1_Click()
If CheckBox5.Value Or CheckBox6.Value Or CheckBox7.Value Then
bl = 5
If CheckBox5.Value Then
Sheets("管理").Select
Cells.Select
Range("a1").Select
保存_start
End If
bl = 5
If CheckBox6.Value Then
Sheets("カット").Select
Cells.Select
Range("a1").Select
保存_start
End If
bl = 5
If CheckBox7.Value Then
Sheets("ノズル").Select
Cells.Select
Range("a1").Select
保存_start
End If
MsgBox "通信終了"
Unload Me
Else
MsgBox "何も選択されていません"
End If
End Sub
Private Sub 保存_start()
Cells.Select
Selection.Copy
Workbooks.Add
ActiveSheet.Paste
Application.CutCopyMode = False
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Flname = "c:\" & ActiveSheet.Name & "-" & CStr(Format(Date, "yymmdd") & _
"-" & Format(Time, "hhmmss")), FileFormat:=xlCSV
ActiveWindow.Close
ThisWorkbook.Activate
Application.DisplayAlerts = True
End Sub
No.5ベストアンサー
- 回答日時:
こんにちは。
シンプルなサンプルを。。。(^^;;;
Userform上に、CheckBox5,67 とCommandButton1が配置されてるとした場合
フォームモジュールに以下のコードを貼り付けて試してみてくださいな。
------------------------------------------------
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Call CreateCVS("管理", CheckBox5.Value)
Call CreateCVS("カット", CheckBox6.Value)
Call CreateCVS("ノズル", CheckBox7.Value)
Application.ScreenUpdating = True
Unload Me
End Sub
--------------------------------------------------
Sub CreateCVS(SheetName, CheckValue)
Dim myPath As String
Dim myBook As Workbook
Dim myBookName As String
If CheckValue Then
myPath = ThisWorkbook.Path & "\"
myBookName = myPath & SheetName _
& "-" & Format(Date, "yymmdd") _
& "-" & Format(Time, "hhmmss")
ThisWorkbook.Sheets(SheetName).Cells.Copy
Set myBook = Workbooks.Add
With myBook
.Sheets(1).Paste
.SaveAs Filename:=myBookName, FileFormat:=xlCSV
.Close savechanges:=False
End With
End If
End Sub
-----------------------------------------------
未選択などのMsgBoxはご自分で。
以上です。
No.9
- 回答日時:
またまたまたこんばんは。
(^^;;;原因を究明しないでコードの入れ替えだけでは意味がないので、ちょとオートメーションエラーの原因を考えてみました。
もしかして、Me.Hide より前で、Unload Me とかしてませんか?
もしそうであればオートメーションエラーが出ますので、どちらかを削除してください。
以上です。
こんにちは。
先週は長きにわたりありがとうございました
もう一度初めからすると問題なく動きました!!
完成しました。ありがとうございます。
また、何かありましたらその時はよろしくお願いします
No.8
- 回答日時:
またまたこんばんは。
こっちでは上手くゆきますが・・・。(^^;;;
では以下のように、
MsgBoxの順序を入れ替えて、
Me.Hide を Unload Userform1 にしてみましょうか。
-------------------------------------------------
● MsgBox "ファイル作成完了"
Application.ScreenUpdating = True
▲ Unload Userform1
Else
MsgBox "チェックボックス未選択"
End If
-----------------------------------------------
以上です。
No.7
- 回答日時:
こんばんは。
上手くいきましたか、良かったですね。
メッセージは最初の質問でちゃんとやってますよね。(^^;;;
------------------------------------------------
Private Sub CommandButton1_Click()
If CheckBox5 Or CheckBox6 Or CheckBox7 Then
Application.ScreenUpdating = False
Call CreateCVS("管理", CheckBox5.Value)
Call CreateCVS("カット", CheckBox6.Value)
Call CreateCVS("ノズル", CheckBox7.Value)
Application.ScreenUpdating = True
Me.Hide
MsgBox "ファイル作成完了"
Else
MsgBox "チェックボックス未選択"
End If
End Sub
------------------------------------------------
以上です。
No.6
- 回答日時:
再度のこんにちは。
このコードはテスト済みです。
いまもテストしましたが上手くいきますよ。(^^;;;
新しいブックで
質問と同じシート名
同じユーザーフォーム
同じチェックボックス
同じコマンドボタン
それでテストしてみてください。
または、そのコードをアップしてみて下さい。
皆で解決しましょう。
以上です。
ありがとうございます!!
やったー動きました。
よく見直してみたら動きました。
メッセージBOXで格闘していますが
うまく出来ません(泣)
No.4
- 回答日時:
No.3のmatsu_junです。
ちなみに> 最後の保存の所もシート名がちゃんと反映されていないみたいで
の部分ですが、保存_start()において
Workbooks.Add
つまり新規ブックをオープンした時点で、
今まで一番表面に出ていたシート、すなわちActiveSheetが、
もともとのブックの管理(あるいはカット、ノズル)から新規ブックのSheet1に
変わってしまったために起こる現象ですね。
だから、
> ActiveWorkbook.SaveAs Flname = "c:\" & ActiveSheet.Name & "-" & CStr(Format(Date, "yymmdd") & _
の行中の「ActiveSheet.Name」が「Sheet1」となってしまうわけです。
VBA検証の際に、ブレイクポイントとステップイン、ウォッチ式を利用していますか?
マクロの上の方の行にカーソルを合わせてF9ボタンを押すとブレイクポイントが設定され、
マクロの実行がその行で一時停止します。
(設定した同じ行でもう一度F9を押せば解除されます)
一時停止したら、F8キーを押せば、一行ずつ実行していきます(ステップイン)
コードの任意の変数を選択(ドラッグ)して右クリック、「ウォッチ式の追加(A)」を選んでください。
ウィンドウ下部に変数の値が表示されます。「ActiveSheet.Name」をウォッチ式に追加し、
一行ずつ実行した上で値を確認してみてください。
No.3
- 回答日時:
No.1 のctrlzr様の方法が賢いと思いますが、もう少し分かりやすい方法を取りましょう。
If CheckBox5.Value Then
Sheets("管理").Select
Cells.Select
Range("a1").Select
保存_start
End If
を、以下のように直します。
If CheckBox5.Value Then
保存_start ("管理")
End If
CheckBox6、CheckBox7についても同様です。
次に、保存_start() を、以下のようにします。
「Private Sub 保存_start()」を「Private Sub 保存_start(SHNAM As String)」に
Cells.Select
Selection.Copy
を
Sheets(SHNAM).Cells.Copy
に。
ActiveWorkbook.SaveAs Flname = "c:\" & ActiveSheet.Name & "-" & CStr(Format(Date, "yymmdd") & _
を
ActiveWorkbook.SaveAs Filename:="c:\" & SHNAM & "-" & CStr(Format(Date, "yymmdd") & _
に修正してください。
以上で期待通りの動作をすると思います。
さて、ctrlzr様もおっしゃっているように、「Activate」や、「Select」は
必要がなければ利用しないほうが動作の高速化が図れます。
マクロの自動記録を行うと、どうしても上の2つが登場するので
自分でコードを書く時もつい使いがちですが、
例えばSheet1のセルA1に「2」を入力するマクロを自動記録で行うと
Sheets("Sheet1").Select
Range("A1").Select
ActiveCell.FormulaR1C1 = "2"
Range("A2").Select
となりますが、Sheet1シートのセルA1に2を代入するという操作に対して
マクロの実行中に一々Sheet1を画面に表示させる必要も、セルA1にカーソルを合わせる必要も
A1に2を代入した後セルA2にカーソルを合わせる必要もありません。
これらは手入力を行う際に仕方なくすることです。だから上の4行は
Sheets("Sheet1").Range("A1").Value = "2"
と簡単に書き換えることができます。「.」を日本語の「の」あるいは「を」と解釈すれば
上の式の意味が非常にわかりやすいです。ここでの「=」は、「左辺に右辺の値を代入する」
という意味なので、
「"Sheet1"という名前のシート」 の 「"A1"という名前のセル群(この例では1つだけですが)」
の 「値(Value)」 に 「2」 を代入する。
という意味になりますね。結果としてSheet1のセルA1に2が代入されたという意味では最初の例も
あとの例も同じになることを確認してみてください。そういう意味で
Cells.Select
Selection.Copy
「全セル(Cells)」を「選択(Select)」し、「選択したもの(Selection)」を「コピー(Copy)」する
ということと
Cells.Copy
「全セル(Cells)」を「コピー(Copy)」する
ということは、結果としては同じことができていますね。
次に、関数名の
「Private Sub 保存_start(SHNAM As String)」
について説明します。カッコの中は「引数(ひきすう)」と呼び、関数に値を渡すためのものです。
関数の中で「SHNAM」は変数として扱われます。
私が修正した関数の中に、一箇所だけ"SHNAM"が利用されていることがお分かりですね。
If CheckBox5.Value Then
保存_start ("管理")
End If
で「保存_start」を呼び出したときには、SHNAMに「管理」という文字データが入っています。
CheckBox6の場合は、SHNAMに「カット」が、7の場合は「ノズル」が入ることになります。
hou66様が保存する動作をサブルーチン化したのは大変優れていると思いますが、
場合によって少しだけ条件が変わる場合(今回の場合は保存シート名とファイル名)は、
その部分だけサブルーチンに引き渡してやるのが賢いやり方ですよね。
ちなみに 「As String」というのは、「(引数SHNAM)は、文字列を格納しますよ」という意味です。
そういう意味で、
「Sheets("管理").Select ("管理"という名前のシートを選択)」と
「保存_start ((選択したシートについて)保存_startを行う)」はまとめて
「保存_start ("管理") ("管理"(という名前)について、保存_startを行う)」
と書いたほうがきれいですね。他の行にも応用が効きますし。
ありがとうございます!!
非常に丁寧な説明で初心者の私にはとてもありがたいです。まだまだ勉強しないといけませんね
また、よろしくお願いします。
No.2
- 回答日時:
Workbooks.Add
で、アクティブなブックが「新規ブック」になっているので、
ActiveSheet.Name で名前を取得しても、Sheet1 とかになってしまいます。
サブルーチンの引数にシート名を渡すのが一番かと思います。
動作確認はしていませんが、こんな感じに。
また、テキストボックスにはシート名が表示(Caption)されているものとします。
With CheckBox7
If .Value Then
Sheets(.Caption).Select
Cells.Copy
Call 保存_start(.Caption)
End If
End With
Private Sub 保存_start(sName)
Dim SaveName As String
Workbooks.Add
ActiveSheet.Paste
SaveName = "c:\" & sName & Format(Now(), "-yymmdd_hh.mm.ss")
ActiveWorkbook.SaveAs Flname = SaveName, FileFormat:=xlCSV
End Sub
なお、ファイル名には":"は使用出来ません。
この回答への補足
ご指導ご回答ありがとうございます。
テキストボックスは使ってなくてUserFormを使用しています。チェックBOXで保存したいシート名をチェックしたあと
コマンドボタンで保存としたいのですが・・・・
チェックBOXは複数選ぶ時もあります
説明が下手で申し訳ありません。
No.1
- 回答日時:
このコードをbasかシートに書くかで違ってきます。
If CheckBox6.Value Then
Sheets("カット").Select
:
Private Sub 保存_start()
Cells.Select<- ここで、"カット"シートのA1を選択していそうだが、コードの場所によって違う
そもそもVBAで、selectやActivateを使用するケースは実行後にカーソルを戻すときぐらいです。
ご質問のようなコードを書くと、処理対象が不明確になります。
dim sh as worksheet
If CheckBox5.Value Then
set sh = Sheets("管理")
Private Sub 保存_start(sh)
End if
:
Private Sub 保存_start(byval sh as worksheet)
sh.Cells.Copy
Workbooks.Add
ActiveSheet.Paste
:
以下同じ(ただ、csvに保存するだけなら、New bookを生成する必要はありません)
この回答への補足
すみません。
出だしの”このコードをbasかシートに書くかで・・・”
のbasってなんでしょうか?(泣)
根本的に全然分かっていないかも知れません。
たぶん、それが分かっていないから保存_start(sh)
の(sh)がなぜ入っているのかや(byval sh as worksheet)
ってのが理解できないのです。
早々のご回答ありがとうございます。
なるほど・・・・色々あるのですね
NEW BOOKを作るのは、一日に何回も同じ処理を
行うためです。CSVで保存するとシートが無くなって行ってしまう様に思いますので、コピーして保存して・・・・て行いたいのです。
最後の保存の所もシート名がちゃんと反映されていないみたいで 悩んでいます
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) シートを選択して、1つのPDFにしたいのですが。 5 2022/10/03 20:18
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Googleドライブで保存した(自...
-
保存すると背景が真っ黒になっ...
-
シールテープの代わり
-
「Word2019」の自動保存を解除...
-
Photoshop CMYKへの変換
-
パワーポイントの図をGIF形式の...
-
イラストレーターに取り込んだ...
-
【アイコンの背景色が黒塗りに...
-
ペイントのBMPで作ったアイコン...
-
保存した画像の余白カットしたい
-
画像の拡大率を固定したまま次...
-
JPEG画像に直接URLを埋め込むこ...
-
イラストレーター、配置した白...
-
Snipping Toolのキャプチャ画面...
-
ソリッドワークスで作成したア...
-
Photoshopで写真のpngをjpgに変...
-
パワーポイントの図をペイント...
-
After Effectsにjpgを貼ると画...
-
Illustratorのリンク画像が印刷...
-
画像を円に沿ってぐるりと配置...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Googleドライブで保存した(自...
-
VBAを使って、上書き保存の...
-
保存すると背景が真っ黒になっ...
-
シールテープの代わり
-
GIFファイルの保存ってできない...
-
パワーポイントの図をGIF形式の...
-
「Word2019」の自動保存を解除...
-
Instagramの 王冠を逆さにした...
-
イラレデータのPDF保存 サイズ...
-
Wordで内容変更後別名保存する...
-
拡張子が jfif のファィ...
-
saiで絵を書いてるんですけど P...
-
windows10で作業を終了する際の...
-
MATLABのグラフをファイルに保...
-
VBAでエクセルの内容を変換し、...
-
operaでの画像の保存についてで...
-
フォトショップ保存時のファイ...
-
(VBA)特定のシートのみを名前...
-
ファイル名の後につくversionと...
-
CLIP STUDIO PAINTの漫画をブロ...
おすすめ情報