• 締切済み

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

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

  • genee
  • お礼率68% (13/19)

みんなの回答

回答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/17068)
回答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% (454/690)
回答No.1

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

genee
質問者

お礼

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

関連するQ&A

  • エクセルでセル内容でフォルダを作って保存

    今はマクロボタンをクリックすると特定のセルの内容で指定したフォルダにPDFで保存されるようにして使っているのですがその前段取りが結構手間がかかって間違いも多いので改良したいのです。 やりたいことは、 決まった名前(見積書)のシート上のセルの内容(顧客名)で、例えばデスクトップの決まったフォルダ(見積書)の中に、A1セルの内容(顧客名)でフォルダを作成し、セルB2+C3の内容(日付+見積No)をファイル名にPDFで保存する、ということは出来るのでしょうか? 更にA1(顧客名)が同じなら既存の顧客フォルダにB2+C3で保存したいのですが。。。 かなり贅沢な要求だと思いますが、もし可能であればよろしくお願いします。

  • 違うシートのデータを1つのPDFファイル保存VBA

    Sub データPDFファイル化() If MsgBox("ファイルをPDF化し過去データとして保存します。よろしいでしょうか?", vbYesNo) = vbNo Then End End If If Range("L2").Value <> "" Then Dim Fn As String Fn = Format(Range("L2"), "yyyy年m月d日") & ".pdf" ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _ Filename:="D:\フォルダB\過去記録データ保存用フォルダ\データ\" & Fn Else MsgBox "セルL2にファイル名が入力されていません。", vbExclamation End If End Sub この様なコードがあります。エクセル2003では使用出来ないのでエクセル2007以降の使用です。 これはシート名「A」にコマンドボタンを設置し、そのコマンドボタンを押すとPDF化して保存するマクロです。 そこで質問ですがコマンドボタンを押すとシート名「A」と隣にあるシート名「B」をまとめてPDFファイルで保存する方法はどの様にすれば良いのでしょうか? PDF化した際は1ページ目がシート名「A」で2ページ目がシート名「B」を表示させ、名前はシート名「A」のL2(yyyy年m月d日)で保存します。

  • 名前をつけて保存で、フォルダ名を自動セットしたい

    ファイルをダウンロードして、「保存」を選択すると、保存先を指定する「名前をつけて保存」ダイアログボックスが表示されます。 ダウンロードするファイルがA,B,C3種類あるとき、ダウンロード先のフォルダ名を3箇所に振り分けたいのですが、JSPなどで指定できないでしょうか。 Aファイルを保存のときPCのC:\保存\A Bファイルを保存のときPCのC:\保存\B Cファイルを保存のときPCのC:\保存\C Aファイルを保存した後、BファイルやCファイルをダウンロードしたとき、 保存先にC:\保存\Aが表示されます。 よろしくご教授ださい。

  • Excel VBA 複数シートを各シート名で保存

    Excel VBA で、複数シートを各シート名で保存したい場合はどうすればいいでしょうか? シート名が、[フォーム] [A社] [B社] [C社] [D社] … というBookがあります。 [フォーム]シートを除く他のシートを、シート名をそのままファイル名にして、 それぞれ別ファイルで保存する場合、どのように記述すればいいのか どなたかおわかりになりましたら、教えてください。 よろしくお願いします。

  • エクセルのマクロでシートを表示させる

    マクロ初心者です。 1つのブックに20シート入っているのですが、 チェックBOXにチェックを付け、該当するシートのみを表示させるマクロを教えてください。 sheet1以外の下記のシートA~Dは非表示になっており sheet1にはシート名 A B C D というチェックBOXがあり、 例えば、Bにチェックを入れるとBのシートが表示され、 AとDなど複数チェックが入るとチェックしたシートが表示される様な マクロがありましたら、教えてください。 マクロの記録で読み込ませているのですが、複数シートの為、限界を感じております。 よろしくお願い致します。

  • クロ(VBA)を使用してフォルダ内のファイルを検索し、開きたい

    クロ(VBA)を使用してフォルダ内のファイルを検索し、開きたい 私は今、仕事で WINDOWS XP エクセル2003を使用しています。今度新しくデータの管理をすることになりました。エクセルだけで解決しようにも、マクロを使わなければいけないみたいでマクロに関しては初心者です。 今やりたいことなのですが エクセルのファイルで 1000 Aさん   1001 Bさん  1002 Cさん といった感じで個人のデータを同一フォルダで管理しています。 それを プログラムで1000と入力し表示するように入力すると、Aさんのファイルが開くというしくみのプログラムを作りたいと思っています。 画像で作ったフォームみたいに、ラベル、テキストボックス、コマンドボタンで外見までは作れたのですが、それ以降のコード入力がちんぷんかんぷんで分かりません。 もし、良いやりかたなどがあれば教えていただければと思います。また、マクロなんかを使わなくてももっと良いやり方があれば教えていただけると嬉しいです。(エクセルファイルでハイパーリンクで直で飛ぶように設定したりもしたんですが、OKがもらえませんでした。)

  • 複数ファイルの同じ位置のセル内容を、それぞれファイル名・シート名にして保存したい

    VBA初心者ですが、いろいろなQ&Aを検索して、やりたいことの解決方法を模索しているのですが、私の疑問にドンピシャの回答が見つからず悩んでいます。 目的は、あるフォルダ内の、複数のランダムなファイル名のエクセルファイルについて、それぞれのファイルを開き、アクティブシートのA1セルの入力内容に基づき、そのシートの名前を変更し、ファイル名も変更して保存するという作業です。(例えば、A1に「山田」と入っていたら、シート名も「山田」にして、「山田.xls」で保存する。) マクロの自動作成で、例えば「A」というファイルは開いてシート名を変え、ファイル名を付けて保存するくらいのことはできるのですが、ファイル名がランダムに代わったり、ファイル数が複数になるとできません。 このようなマクロを作ることは可能なのでしょうか?。 よろしくお願いいたします。

  • VBAワーク シート名前を付けて作成

    エクセルVBAにて 原紙とゆう名前のワークシートをコピー処理して 入力フォームにテキストボックス1と2があり コピーした原紙とゆうワークシート名から テキストボックス1と2に入力した項目が 合わさってワークシート名に変更する方法はあるのでしょうか? 例)テキストボックス1に 123   テキストボックス2に 456 コマンドボタン1をクリックすることによって ワークシート名が123456となるようにしたいのですが? 宜しくお願いいたします。

  • エクセルのマクロを使ってシートごとに名前をつけて保存したい

    マクロ初心者です。宜しくお願いします。 1つのブックにシートが複数あります。 それぞれシートをコピーして新しいブックを作成し そのブックに名前をつけて保存したいです。 例えばブック名が「売上管理」でそのシートが「A店」「B店」「C店」と3シートあるとします。 シート名:A店を他のブックにコピーしてマイドキュメントに名前を付けて 保存する場合のマクロを教えてください。 ちなみにその際のブック名は「シート名+任意のセル(D2)」と できれば一番助かります。 ちなみにD2のセルにはToday関数が入ってます。

  • VBA チェックボックスをチェックした名前のみ抽出

    数百名のリストからチェックした名前のみ抽出したいと思いまして。 1.シート1のA、C、E…奇数列にフォームのチェックボックスを配置 2.B、D、F…偶数列に名前を並べる 3.チェックボックスでクリックし、チェックマークが出る 4.マクロでSheet2のA列から抽出された名前を並べる 宜しくお願いします。

専門家に質問してみよう