dポイントプレゼントキャンペーン実施中!

皆様お世話になります。
昨日は一括保存をご教授していただきありがとうございました。

早速ですが今回は、チェック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

A 回答 (9件)

こんにちは。



シンプルなサンプルを。。。(^^;;;

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はご自分で。
以上です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
動きましたが・・・・
残念ながら、複数選択した場合"管理"のみ
保存しているようです。

お礼日時:2005/04/08 16:28

またまたまたこんばんは。

(^^;;;

原因を究明しないでコードの入れ替えだけでは意味がないので、ちょとオートメーションエラーの原因を考えてみました。

もしかして、Me.Hide より前で、Unload Me とかしてませんか?
もしそうであればオートメーションエラーが出ますので、どちらかを削除してください。

以上です。
    • good
    • 0
この回答へのお礼

こんにちは。
先週は長きにわたりありがとうございました
もう一度初めからすると問題なく動きました!!

完成しました。ありがとうございます。

また、何かありましたらその時はよろしくお願いします

お礼日時:2005/04/11 11:01

またまたこんばんは。



こっちでは上手くゆきますが・・・。(^^;;;

では以下のように、
MsgBoxの順序を入れ替えて、
Me.Hide を Unload Userform1 にしてみましょうか。

-------------------------------------------------
●   MsgBox "ファイル作成完了"

   Application.ScreenUpdating = True

▲   Unload Userform1

 Else

     MsgBox "チェックボックス未選択"

 End If
-----------------------------------------------

以上です。
    • good
    • 0

こんばんは。



上手くいきましたか、良かったですね。
メッセージは最初の質問でちゃんとやってますよね。(^^;;;

------------------------------------------------
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
------------------------------------------------

以上です。
   
    • good
    • 0
この回答へのお礼

重ね重ねありがとうございます。
メッセージBOXやってみました
Me.Hideの部分がオートメーションエラーとか言ってます。

お礼日時:2005/04/08 22:26

再度のこんにちは。



このコードはテスト済みです。
いまもテストしましたが上手くいきますよ。(^^;;;

新しいブックで
質問と同じシート名
同じユーザーフォーム
同じチェックボックス
同じコマンドボタン
それでテストしてみてください。

または、そのコードをアップしてみて下さい。
皆で解決しましょう。

以上です。
    • good
    • 0
この回答へのお礼

ありがとうございます!!
やったー動きました。
よく見直してみたら動きました。
メッセージBOXで格闘していますが
うまく出来ません(泣)

お礼日時:2005/04/08 21:28

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」をウォッチ式に追加し、
一行ずつ実行した上で値を確認してみてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
そうですね、そんな確認方法があったんですね
たびたび、すみません。
また、よろしくお願いします

お礼日時:2005/04/08 14:41

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を行う)」
と書いたほうがきれいですね。他の行にも応用が効きますし。
    • good
    • 0
この回答へのお礼

ありがとうございます!!
非常に丁寧な説明で初心者の私にはとてもありがたいです。まだまだ勉強しないといけませんね
また、よろしくお願いします。

お礼日時:2005/04/08 14:38

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は複数選ぶ時もあります

説明が下手で申し訳ありません。

補足日時:2005/04/08 08:03
    • good
    • 0

このコードを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)
ってのが理解できないのです。

補足日時:2005/04/08 07:56
    • good
    • 0
この回答へのお礼

早々のご回答ありがとうございます。
なるほど・・・・色々あるのですね
NEW BOOKを作るのは、一日に何回も同じ処理を
行うためです。CSVで保存するとシートが無くなって行ってしまう様に思いますので、コピーして保存して・・・・て行いたいのです。
最後の保存の所もシート名がちゃんと反映されていないみたいで 悩んでいます

お礼日時:2005/04/07 22:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!