[[20250603144242]] 『Excelシートの保存』(SEL) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『Excelシートの保存』(SEL)

Excelで固定のsheet(例えば チェック1,チェック2という名前の固定シート)だけを新規bookにコピーして、
CTrl+shift+アルファベットをクリックすると
(C)ローカルの所定のフォルダに保存する記述を教えてください。

シートを抜き出さなくても bookごと保存して
不要なシート(4シートくらいあります)を削除してもよいです。
宜しくお願い致します。

< 使用 Excel:Excel2019、使用 OS:Windows11 >


 Sub sample()
     Const SAVE_DIR = "C:\FolderName"
     Dim wb As Workbook : Set wb = Workbooks.Add
     Dim sh As Worksheet
     For Each sh in ThisWorkbook.Sheets("チェック1","チェック2")
         sh.Copy After:= wb.Sheets(wb.Sheets.Count)
     Next sh
     Application.DisplayAlerts = False
     wb.Sheets(1).Delete
     Application.DisplayAlerts = True
     wb.SaveAs SAVE_DIR & "チェックシート" & "_“ & Format(Date, "mmdd") & ".xlsx"
 End Sub

(FL) 2025/06/03(火) 14:53:00


失礼しました。こちらの方が正当かも
 Dim sh As Worksheet
 For Each sh In ThisWorkbook.Sheets
    If sh.Name = "チェック1" Or sh.Name = "チェック2" Then
        sh.Copy After:=wb.Sheets(wb.Sheets.Count)
    End If
 Next sh
(FL) 2025/06/03(火) 14:56:26

>CTrl+shift+アルファベットをクリックすると
 ↑ なんなんこれ?

(梅雨入り) 2025/06/03(火) 14:59:24


 > ↑ なんなんこれ?
 マクロのショートカットキーかと
(FL) 2025/06/03(火) 15:02:53

FLさん ありがとうございます。

正当と書いていただく前に記載いただいた中に、
wb.SaveAs SAVE_DIR & "チェックシート" & "_“ & Format(Date, "mmdd") & ".xlsx" と記載いただきましたが シートコピーして新たなbookを (C)ローカルの 実績フォルダに
所定の名前を付けて保存したく、

ファイル名は 実績&当日の日付と時間にしたいです。
重ね重ね申し訳ないですがご教示ください。

※マクロのショートカットキーは忘れて下さい、、(失礼しました)

(SEL) 2025/06/03(火) 15:22:07


 Const SAVE_DIR = "C:\実績\"
 と変更

 wb.SaveAs SAVE_DIR & "実績" & "_“ & Format(Now, "yymmdd_hhmm") & ".xlsx"
 と変更

 です。
(FL) 2025/06/03(火) 15:48:42

FLさん ご丁寧にありがとうございます。
実行すると コンパイルエラー 引数の数が一致していません。または不正なプロパティを指定しています。と表示されます。↓Sheetsのところです。

 For Each sh in ThisWorkbook.Sheets("チェック1","チェック2")

原因おわかりになりますでしょうか。
宜しくお願い致します。
(SEL) 2025/06/03(火) 17:25:27


 失礼しました。こちらの方が正当かも
 Dim sh As Worksheet
 For Each sh In ThisWorkbook.Sheets
    If sh.Name = "チェック1" Or sh.Name = "チェック2" Then
        sh.Copy After:=wb.Sheets(wb.Sheets.Count)
    End If
 Next sh

 こちらご確認ください。
(FL) 2025/06/03(火) 17:27:09

 下記でもいいかと。

 Sub Sample()
    Const SaveFolder = "C:\実績\"
    Sheets(Array("チェック1", "チェック2")).Copy
    ActiveWorkbook.SaveAs SaveFolder & "実績" & "_" & Format(Now, "yymmdd_hhmm") & ".xlsx"
 End Sub

(hatena) 2025/06/03(火) 17:54:27


 解説しておきます。 

 複数シートをまとめて操作するときは、Sheets(Array("チェック1", "チェック2")) というようにはArray関数で配列にする。

 Copyメソッドでコピー先ブック名を省略すると新規ブックにコピーされる。

 Copyメソッドの実行後はコピー先ブック(新規ブック)がアクティブになっている。
(hatena) 2025/06/03(火) 18:00:50

FLさん 度々ありがとうございます。
ファイルはC:実績に保存になりました。

追加したいのが、
?@保存しましたのメッセージを出す
?A保存したファイルは閉じる ですがうまくいきません。(元のツールが閉じてしまう、メッセージが出ない)
添削いただけないでしょうか。

Const SAVE_DIR = "C:\実績\"

     Dim wb As Workbook: Set wb = Workbooks.Add
     Dim sh As Worksheet

 For Each sh In ThisWorkbook.Sheets
    If sh.Name = "チェック1" Or sh.Name = "チェックシ2" Then
        sh.Copy After:=wb.Sheets(wb.Sheets.Count)
    End If
 Next sh

     wb.SaveAs SAVE_DIR & "実績" & "_" & Format(Now, "yymmdd_hhmm") & ".xlsx"

     ThisWorkbook.Close

     MsgBox "実績に保存しました"

End Sub
(SEL) 2025/06/03(火) 18:04:29


追記です。

追加したいのが、から文字化けしました。失礼しました。

1.保存しましたのメッセージを出す
2.保存したファイルは閉じる ですがうまくいきません。
(元のツールが閉じてしまう、メッセージが出ない)

(SEL) 2025/06/03(火) 18:05:59


 ThisWorkbook.Close
 →wb.Close False 
 に変更

 MsgBoxはそのままです。

 "実績" & "_"
 →"実績_"
 でよかったです。
(FL) 2025/06/03(火) 18:14:46

(FL)さん
ありがとうございます。

1.保存しましたのメッセージを出す ←出ました!
2.保存したファイルは閉じる ←閉じました!

Cの実績に保存したファイルを開くと
チェック2のシートが開くので、最初のシート(チェック1)を開くことは可能でしょうか。
また、仕方ないのかもしれませんが、
sheet1 が勝手に作られます(←それ自体は問題ないのですが・・・)

(SEL) 2025/06/03(火) 18:33:51


(hatena)さん 詳しくご教示いただきましてありがとうございます。
(SEL) 2025/06/03(火) 18:36:45

 > 1.保存しましたのメッセージを出す
 > 2.保存したファイルは閉じる

 Sub Sample()
    Const SaveFolder = "C:\実績\"
    Sheets(Array("チェック1", "チェック2")).Copy
    With ActiveWorkbook
        .SaveAs SaveFolder & "実績_" & Format(Now, "yymmdd_hhmm") & ".xlsx"
        .Close
    End With
    MsgBox "実績に保存しました"
 End Sub

 これで、
 保存した実績ファイルを開くと チェック1 がアクティブになってます。
 sheet1は作られません。

(hatena) 2025/06/03(火) 20:47:18


 Application.DisplayAlerts = False
 wb.Sheets(1).Delete
 Application.DisplayAlerts = True

 この3行記述してないからですね
(FL) 2025/06/03(火) 20:49:21

 ちなみに、hatenaさんの回答が最もわかりやすいかと。
 マクロの記録に沿ったような記述をするとそうなります。

 わざわざ新しいブックを作成してそちらにコピーしているのは
 ActiveやSelectをベースにコードを記述する癖がつくと
 異なる環境で正常に動作しないマクロが乱立することになるので
 無意識的に避けているだけです。
 ※シートのインデックスが変わること考慮してねーじゃんというツッコミはご愛嬌で。
(FL) 2025/06/03(火) 21:09:17

(FL)さん わかりやすく解説いただきありがとうございます。
(hatena)さんのご回答を参考に、実施させていただきましたところ
 sheet1はなくなり一番前のシートが開きました。
(hatena)さんご丁寧にご教示いただきありがとうございます。

厚かましいですが、もう1つありまして、
チェック1,チェック2シートはピボットで、その元となるデータを開く作業が手前にあるのですが、
対象のファイルを開く →ファイルを開いたときにもし違うファイルを開いてしまったときの
分岐を作りたいです。
2つのファイルの違いは、ファイル名の冒頭が”実績・・・”か”売上・・・”とそれぞれ固定です。
実績のファイルを設定するはずが、売上のファイルを設定したときに、ファイルが違います。と
分岐したいのですが ご教示いただけませんか。

途中まで記載します↓

MsgBox ("実績ファイルを開いてください")

 Dim OpenFileName As String
 Dim macroBook As Workbook
 Set macroBook = ActiveWorkbook

 Sheets("実績").Select

    Range("B2:AM1000").Select
    Selection.ClearContents

  OpenFileName = Application.GetOpenFilename("実績,*.xls?")
   If OpenFileName <> "False" Then
      Set Wb1 = Workbooks.Open(OpenFileName)

      Else

      MsgBox "ファイルが間違っています"

       End If ・・・・ ここで脳が停止しました。

(SEL) 2025/06/04(水) 08:52:43


 FLさん
 > ActiveやSelectをベースにコードを記述する癖がつくと
 > 異なる環境で正常に動作しないマクロが乱立することになるので
 > 無意識的に避けているだけです。

 重要な指摘だと思います。
 ActiveやSelectはなるべく使わない。
 Activeなオブジェクトを対象にするのを前提のコードは避ける。
 というのは私も意識しています。

 AddメソッドのようにCopyメソッドもブックオブジェクトを返すという仕様なら、
 Set wb = Workbooks.Copy
 というような記述ができるのですが、残念ながらそのような仕様ではないです。
 仕方ないので対策として、
 Copyメソッドの直後にオブジェクト変数にActiveWorkbookを代入する
 あるいは、上記の私のコードのようにWithステートメントで有効範囲を
 明確にする
 というように意識してコーディングしてます。

 このような観点から、SELさんの前記のコード
  Sheets("実績").Select
  Range("B2:AM1000").Select
  Selection.ClearContents
はあまりよろしくないですね。下記のようなコードにするように意識しましょう。

  ThisWorkbook.Sheets("実績").Range("B2:AM1000").ClearContents

 で、本題ですが、

 > 実績のファイルを設定するはずが、売上のファイルを設定したときに、ファイルが違います。と
 > 分岐したいのですが ご教示いただけませんか。

 ファイルが違っていた場合、分岐してどうしたいのでしょうか。
 それを明確にしましょう。

 違っていたら、
 「違うよ」とメッセージを表示して以降の処理を中止する
 のか、
 「違うよ」とメッセージを表示して再度ファイル選択ダイアログを表示する
 正しいファイルを選択するまで繰り返す
 とするのか、
(hatena) 2025/06/04(水) 13:37:20

(hatena)さん
以下コード解説とてもためになります。ありがとうございます。
今回も含め今後気を付けたいと思います。

>下記のようなコードにするように意識しましょう。

  ThisWorkbook.Sheets("実績").Range("B2:AM1000").ClearContents

ファイルが違っていた場合の分岐ですが、
「違うよ」の後は、

「もう一度ファイルを選択してください」とメッセージを出して はい(YES)だとファイルを選び直す(プロパティ表示)、 いいえ(NO)は 処理を終了します。コメントがよいです。

正しいファイルを選択し続けるまで連続してもよいと思いましたが、ツールに不慣れな人が使うこともあるので いいえを選択した場合は、最初から設定し直しの方がわかりやすいかと思いました。

宜しくお願い致します。

※そのあと、開いたファイルの A2:AMセルの一番下のセル(変動)をコピーして、
実績シートのA2から貼りつける
そのあと、A〜AV列を選択して 項目を並び替える処理がつづきます。

(SEL) 2025/06/04(水) 14:03:12


>ファイルが違っていた場合の分岐ですが、
>「違うよ」の後は、

> 「もう一度ファイルを選択してください」とメッセージを出して はい(YES)だとファイルを選び直す(プロパティ表示)、 いいえ(NO)は 処理を終了します。コメントがよいです。

一例をあげると下記のようなコードになります。

     Do
        OpenFileName = Application.GetOpenFilename("実績,*.xls?")
        If OpenFileName = "False" Then
            MsgBox "キャンセルされました"
            Exit Sub
        ElseIf Dir(OpenFileName) Like "実績*" Then
            Set Wb1 = Workbooks.Open(OpenFileName)
            Exit Do
        Else
            If MsgBox("ファイルが間違っています。もう一度ファイルを選択してください。", vbOKCancel) <> vbOK Then
                Exit Sub
            End If
        End If
    Loop

下記のような仕様になります。

ファイル選択ダイアログで[キャンセル]を押したら処理中止
正しいファイル("実績"で始まる)を選択したら次の処理へ
間違ったファイルを選択したら
「もう一度ファイルを選択してください。」([OK],[キャンセル])とメッセージを表示して
 OKならDoループの先頭から繰り返す
 キャンセルなら処理中止

(hatena) 2025/06/04(水) 15:32:09


(hatena)さん
ご連絡が遅くなり申し訳ございません。
ご教示いただきましてありがとうございます。
教えていただいた内容で実際設定し動かしたら正しくないファイル名のファイルを設定すると
エラーメッセージでましたし、Noを押すと処理が終わりました。
とても助かりました!
以下全編です。


MsgBox ("実績ファイルを開いてください")

 Dim OpenFileName As String
 Dim macroBook As Workbook
 Set macroBook = ActiveWorkbook

ThisWorkbook.Sheets("実績").Range("B2:AM1000").ClearContents

  Do
        OpenFileName = Application.GetOpenFilename("実績,*.xls?")
        If OpenFileName = "False" Then
            MsgBox "キャンセルされました"
            Exit Sub
        ElseIf Dir(OpenFileName) Like "実績*" Then
            Set Wb1 = Workbooks.Open(OpenFileName)
            Exit Do
        Else
            If MsgBox("ファイルが間違っています。もう一度ファイルを選択してください。", vbOKCancel) <> vbOK Then
                Exit Sub
            End If
        End If
    Loop

   Range("A2:AM1000").Select
    Range(Selection, Selection.End(xlDown)).Select
    ActiveWindow.SmallScroll Down:=2
    Selection.Copy

  macroBook.Activate

    Sheets("実績").Select
    Range("B2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

  Application.CutCopyMode = False

'更新日付(AG列早い時間)順に並び替え
 ※この後実績シートをピボットにするので、ピボットで更新日時を並べ替えすればよいとも思い
  その場合は以下消します。

    Sheets("実績").Select
    Range("A1:AV14").Select
    Range(Selection, Selection.End(xlDown)).Select
    ActiveWorkbook.Worksheets("実績").AutoFilter.Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("実績").AutoFilter.Sort.SortFields.Add2 Key:= _
        Range("AG2:AG200"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _
        :=xlSortNormal
    With ActiveWorkbook.Worksheets("実績").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

   Sheets("表紙").Select

    MsgBox "完了しました"
(SEL) 2025/06/05(木) 08:48:59

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.