• 締切済み

セル内の文と同じ名前のフォルダにシートを保存させる

マクロのフォームにチェックボックス2個とコマンドボタン1個があります。 Excelブック内にシートが3つあり、シート1内のセルA1,B1に入力されている内容をファイル名(例:A1_B1)にし、フォームのチェックボックス1にチェックを入れてコマンドボタンを押すとシート2、チェックボックス2にチェックを入れてコマンドボタンを押すとシート3を、C1に入力されている内容と同じ名称のフォルダに保存させるマクロを作成したいです。 なお、A1,B1,C1は固定で移動はしません。 また、保存先のフォルダは用意されています。 ファイル名が重複する場合は上書きするか確認したいです。 現在、マクロを勉強中です。 図々しいとは思いますが、もし可能であれば、どういう意図でコードを使用しているか等の解説もしていただければ助かります。 どうぞよろしくお願いいたします。

みんなの回答

回答No.4

> どういう意図でコードを いや、そりゃまぁ・・意図は、質問のソレを出来るように、ですけどねぇ。 日本語って難しいですね(笑)。 > 現在、マクロを勉強中です。 ならなおさら、サンプルの意味を自力で読み解く努力も必要ですよ。 大した処理ではないので、コードも大したことないです。 解説が無くてもおそらく読み解けるレベルですよ。 事細かに解説していくとそれなりに文字数もかかりますので、 ザックリ概略だけ連ねていきます。 まず、基本機能のおさらい。 「シート1枚だけを取り出して保存」の機能はエクセルには無いので、 「対象のシートを新しいブックとしてコピーして保存」で代用します。 コレは、#2さんのご回答の通りであると、私も思います。 さて、フォーム。 チェックボックスは「双方(複数)にチェック(選択)可能」なので、 おそらく今回の処理には不適。 エクセルで言う「オプションボタン」の方が適していますよ。 というのは#3さんのご意見に私も同調。   ※選択肢が2通りなら、トグルボタンもありかも。 よって、私はオプションボタンで進めます。 フォームに用意するコントロールは ・オプションボタン1(OptionButton1) ・オプションボタン2(OptionButton2) ・コマンドボタン1(CommandButton1) ・コマンドボタン2(CommandButton2) ・テキストボックス1(TextBox1)   ※(  )内はコントロールの名前。 の5個です。ま、必要ないところは削ってください。 モジュール。 フォームの操作を通して使いたい変数として、 Public Fname As String, FPath As String Public SH As Worksheet この3個を冒頭でパブリック宣言しておきます。 次、フォームが読み込まれるときに動くモジュール。 Private Sub UserForm_Initialize()   Set SH = Sheets("Sheet1")  ' SH に Sheet1 を代入。   TextBox1.MultiLine = True  ' テキストボックスに複数行表示設定   CommandButton1.Enabled = False  ' 初期状態ではコマンドボタンは使えない   With SH     ' Sheet1 のA1:C1に空白があったら     If .Range("A1") = "" Or .Range("B1") = "" Or .Range("C1") = "" Then       TextBox1.Value = "情報不完全"  ' テキストボックスに文言     Else       FPath = "D:\" & .Range("C1") & "\" ' 保存先フォルダ       Fname = .Range("A1") & "_" & .Range("B1") ' 保存ファイル名       ' テキストボックスに表示       TextBox1.Value = "保存するシートを選択してください。" & vbLf & _               "  保存先:" & FPath     End If   End With End Sub 続いて簡単なところから・・で、コマンドボタン2の設定。 Private Sub CommandButton2_Click()   MsgBox "中止"   Unload Me  ' フォームを閉じる End Sub そんなわけで、キャンセルボタンのイメージ。 次、オプションボタン1・2 Private Sub OptionButton1_Click()   ' テキストボックスの表示を更新   TextBox1.Value = "Sheet2 を保存します。" & vbLf & _           "  保存先:" & FPath & vbLf & _           "  ファイル名:" & Fname   ' コマンドボタン1活性化。   CommandButton1.Enabled = True End Sub Private Sub OptionButton2_Click()   ' テキストボックスの表示を更新   TextBox1.Value = "Sheet3 を保存します。" & vbLf & _           "  保存先:" & FPath & vbLf & _           "  ファイル名:" & Fname   ' コマンドボタン1活性化。 CommandButton1.Enabled = True End Sub どちらかを選ぶと、コマンドボタン1が活性化する仕掛け。 ラストでメイン、コマンドボタン1。 Private Sub CommandButton1_Click() Dim TSH As Worksheet  ' ワークシート型変数を宣言   ' オプションボタン1が選択されていたら   If OptionButton1.Value = True Then     ' 変数に Sheet2 を代入     Set TSH = Sheets("Sheet2")   End If   ' オプションボタン2が選択されていたら   If OptionButton2.Value = True Then   ' 変数に Sheet3 を代入     Set TSH = Sheets("Sheet3")   End If   TSH.Copy   ' 選択されたシートを新しいブックとして複製   ' 複製されたブックがアクティブになるので、   ' そのまま名前を付けて保存。   ' ファイル名は UserForm_Initialize で定義した FPath&FName   ActiveWorkbook.SaveAs Filename:=FPath & Fname, _              FileFormat:=xlOpenXMLWorkbook   ' なお、ファイル形式はエクセルブック(.xlsx)   ' 上書きのチェックは SaveAs に依存。   MsgBox "保存完了"  ' メッセージを出して   Unload Me  ' フォームを閉じて終了 End Sub   細かな解説が必要無いように極力簡単に仕上げています。 フォームを開き、シートが選択されていない状態で保存をしないように、 フォーム初期化の段階ではコマンドボタン(保存ボタンと想定)は 押せないように設定してあります。 「オプションボタン」のどちらかを選択することにより活性化、 保存動作に進めるようになります。 「両方選択されることはない」ので、全体的に簡略化できます。 前述の通り、 「分からないところは調べればわかる範囲で」簡単に書いているつもりです。 わからないところを調べながら手探りで進むのもまた勉強ですよ。 問題はこの「処理の流れ」をイメージできるかどうかです。 コレがイメージできているなら、処理する順番に書くだけですから 調べながらでも容易に書けるはずです。 逆にイメージできていないと、何を調べていいのかがわからないので 先に進めなくなってしまうわけです。 なのでまずは、やりたいことをエクセルで手作業でやろうとする場合、 どんな機能を使ってどんな手順で動かして完成させるか。 ソレを考えることを強くオススメします。

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.3

チェックボックスは一般的に複数の選択肢を選択可能な場合に使用されます。 もし、1つだけを選択させたいならオプションボタンを使用しましょう。 #ちなみに、「オプションボタン」と言う呼び名はExcelの方言のようなもので、一般的には「ラジオボタン」と呼ぶことが多いです。 以下の例はチェックボックスのチェックが1つだけの時に対象シートを別名保存するサンプルです。 上書き確認はSaveAsの機能に任せています。 Private Sub CommandButton1_Click()   sName = Sheets(1).Range("A1") & "_" & Sheets(1).Range("B1") '保存ブック名   sPath = Sheets(1).Range("C1") '保存フォルダ      'CheckBox ON=-1、OFF=0な事を利用してチェックされている数を確認   nRtn = CheckBox1.Value + CheckBox2.Value   If nRtn <> -1 Then     MsgBox ("必ず1つチェックが必要です")     Exit Sub   End If      nTarget = 2   If CheckBox2.Value = xlOn Then nTarget = 3   Sheets(nTarget).Copy  '対象シートを新しいブックにコピー   '指定された名前で保存   ActiveWorkbook.SaveAs Filename:=sPath & "\" & sName & ".xlsx"   ActiveWindow.Close End Sub

genee
質問者

お礼

>1つだけを選択させたいならオプションボタンを使用しましょう。 既存のフォームを使用することに固執していて、オプションボタンという発想が湧きませんでした。 教えていただいたサンプルをもとに色々試してみます。 どうもありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

現在のエクセルでは、あるブックの構成する1枚のシートだけを別ブックに(保存)する操作はない。だから (1)白紙のブックを1つ新たに作る(B)。 (2)(1)のその1つのシートに、元のブック(A)のシートを1枚コピーして張り付ける。 (3)フォルダ名はC1セルから、シート名はA1,B1からとってきて、セットしてブックを保存する。 (A)のシートの数だけ、これを繰り返す。 (4)コマンドボタンやチェックボックスを使うのは今は早すぎる。フォームを使うのも早すぎる。 標準モジュールに作って、実行、で、うまくゆくコードをまず作ること。 (5)マクロの記録を取って、使えるところは使うこと。 (6)これから、勉強する身でありながら、回答を丸ごとコピペするようなことは望ましくない。 自分でやってみて、行き詰まるところを探せ。 後記(8)で言う単体課題の照会のほかに下記は必要だろう。 (7)ActiveWorkbookのシートのC1セルの値を順次取るコードを参考に上げる Sub test01() Set wb = ActiveWorkbook For Each sh In wb.Worksheets MsgBox sh.Name ’シート名 MsgBox sh.Range("C1 ") ''C1セルの値 Next End Sub (8)Googleででも「検索語」を工夫し、例えば「VBA 新規ブックの作成」のように照会すれば、VBAコードが出てくる。これを最大限使え。 https://www.excel-excel.com/vbachair/step3-1.HTMLなど多数。 ー こういう回答が嫌なら、後出の親切な回答が出ることをまて。 勉強になりにくい(上達しない)と思うが。 ーー 質問の標題には、VBAでの処理を望む、ことを明記せよ。

genee
質問者

お礼

>これから、勉強する身でありながら、回答を丸ごとコピペするようなことは望ましくない。 ご意見ご尤もです。 アドバイスをありがとうございました。

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.1

・チェックボックス1、2の双方がオフの時は  シート1のA1,B1を使ったファイル名で保存する。  このときは、シート1,2,3の構成のまま保存するんですね?  このときの保存先のフォルダーはどれにすればいいですか? ・チェックボックス1がオン、2がオフの時は、  シート1のC1を使ったフォルダーに保存する。  このフォルダーの親フォルダーはどれにすればいいですか?  それとも、C1にはドライブ以下のフルパスが記述されていますか?   さらにこのときは、シート1だけのファイルとして保存するんですね? ・チェックボックス1がオフ、2がオンの時は  シート1のC1を使ったフォルダーに保存する。  このフォルダーの親フォルダーはどれにすればいいですか?   このときは、シート2だけのファイルとして保存するんですね? ・チェックボックス1、2の双方がオンの時は、  どうすればいいですか? 保存するための条件を箇条書きにし、 漏れの無い説明が望まれます。 特に ・保存先のシート構成 ・保存先のフォルダー ・保存に先立ってフォルダーを作成から保存するのか? ・フォルダーを作成するときに、   すでにそのフォルダーが既にあったときの挙動をエラーにするのか? これらを正確に把握できる説明が必要です。 また、フォームに用意したチェックボックス、 コマンドボタンの名前を明示すると、より説明しやすくなります。 マクロの文法をマスターすることよりも、 要求や仕様を正確に整理し、まとめるスキルのほうが エンジニアにとってより重要です。

genee
質問者

お礼

>マクロの文法をマスターすることよりも、 要求や仕様を正確に整理し、まとめるスキルのほうが エンジニアにとってより重要です。 アドバイス、ありがとうございます。 自分なりに考えたつもりでしたが、足りませんでした。 頭の中で考えるだけではなく、書き出して必要なものと流れをまとめる力をつけたいと思います。