独学で色々調べながらVBA作成しています。うまくいかないので有識者の方からアドバイス頂ければ幸いです。
ブック:AAA.xlsx
シート(左から順に):原本、祝日リスト、1、2~31 ←1ケ月分のシートです。
シート:祝日リスト内には、セルB1~B20までyyyy/mm/ddの形で、祝日の
日付けが入っています。
下記やりたいことです。
祝日リスト内の、B1~B20までの値を格納する★
シート:1~31までの、セル:E1の値と★を照合する。
シートを回すロジックは理解しています。
シート:祝日リストのB1~B20をfor~next文で回し、シート:1のセルE1と値を照合させようとしましたが上手くいきませんでした。
先に、祝日リスト内の値を格納して、後で照合するのが良いのかと思いました。
よろしくお願い致します。
No.5ベストアンサー
- 回答日時:
No2です。
>祝日リストの日付を照合してカウントするのではありません。
リスト内にE1セルの日付と同じものが存在するかどうかを調べたいのではないのでしょうか?
No2の繰り返しになりますが・・
リスト内のそれぞれの値とE1の値を順に比べていってもよいですが、有無を調べれば良いだけと解釈してよいのなら、「リスト内のE1の値をカウントして」結果が0なら存在しない、1以上なら存在すると判断できるという意味です。
(関数が存在するので、それを利用すれば1行で済むし、同じことを判断できるという意味です。)
なお、ご質問には直接関係ありませんけれど、
雰囲気からすると、どうやら・・
1)1日~31日までのシートを作成して
2)土日祝日のシートを削除する
ということをなさろうとしているように感じられますが・・
1日~31日のシートを作成する際に、「土日祝日かを判断して、該当する日のシートは作成しない」ようにしておけば、わざわざ「後から削除して回る」ようなことをしなくても良さそうに思われますし、(大差はないにしても)そちらの方が効率の良い処理方法とも言えるでしょう。
・・という能書きだけでは「なんのこっちゃ?」かものような気がしますので、
以下は勝手に想定した処理内容にしてありますが、手順としては上記の方法で処理を行う例です。
ご参考までに。
※ 年月の指定方法が不明なので、以下ではコード内で指定しています。
※ 指定した年月の1か月のうち土日祝日ではない日のシートを作成し、
シートの内容は、「原本」シートをコピーして、E1セルに日付をシリアル値
で記入すると仮定しました。
※ 祝日のリストは「祝日リスト」シートのB1:B20と仮定。
※ AAA.xlsxは開いた状態であると仮定し、1~31のシートは存在しない状態で
実行するものと仮定しています。
(既に存在する場合には「同じ名前のシートがあります」のエラーになります)
(最初に削除するか、存在チェックのコードを加えれば、エラーは防げます)
Sub Q13678867()
Dim ws As Worksheet
Dim holiday As Range
Dim d As Date
Const yy = 2023 ' ←指定の年
Const mm = 12 ' ←指定の月
With Workbooks("AAA.xlsx") ' ←指定のブック(開いているものとする)
Set holiday = .Worksheets("祝日リスト").Range("B1:B30")
For d = DateSerial(yy, mm, 1) To DateSerial(yy, mm + 1, 0)
If Weekday(d, 2) < 6 And Application.CountIf(holiday, d) < 1 Then
' ** 以下にシートの追加等の処理を記述する
' ** 適当に仮定した処理内容なので、実際のものに入れ替えてください
Set ws = .Worksheets.Add(After:=.Worksheets(.Worksheets.Count))
ws.Name = Day(d)
.Worksheets("原本").Cells.Copy ws.Cells
ws.Range("E1").Value = d
' ** ここまで
End If
Next d
End With
End Sub
No.4
- 回答日時:
以下のマクロは、アクティブシートのE1の日付が祝日シートの日付に
あるかどうかを判定するマクロです。
下記のマクロをあなたが作成したマクロに取り込めば、良いかと思います。
不明点は補足してください。(ディクショナリを使っています)
Public Sub sample()
Dim ws As Worksheet
Dim dicT As Object
Dim wrow As Long
Dim key As Variant
Set ws = Worksheets("祝日リスト")
Set dicT = CreateObject("Scripting.Dictionary")
'祝日シートの祝日を記憶
For wrow = 1 To ws.Cells(Rows.Count, "B").End(xlUp).Row
key = ws.Cells(wrow, "B").Value
dicT(key) = True
Next
'アクティブシートのE1が祝日シートにあるか
key = Range("E1").Value
If dicT.exists(key) = True Then
MsgBox (key & "は祝日シートにあります")
Else
MsgBox (key & "は祝日シートにありません")
End If
End Sub
No.3
- 回答日時:
No1です。
補足ありがとうございました。補足の3番目ですが、
「3.本処理の前に、yyyy/mmを元にシートを作るロジックがあるので、31まで無い月はシートが作成されません。」
ということですが、
マクロでは、29,30,31のシートがあるかどうかが、事前にはわからないことになります。
従って、方法としては、
1案:マクロ実行時に、年月(yyyy/mm)の情報をどこかのセルに書いておき、それを参照して、その月の末日を求め、末日まで繰り返すようにする。
2案:無条件に1~31まで繰り返し、該当シートがない場合は、そのシートの処理はしないようにする。
の何れかになります。
私は、1案を推奨しますが、いかがでしょうか。
繰り返しの方法としては、
1.1~末日の繰り返し
2.その内側でB1:B20の繰り返し
が妥当かと思います。
No.2
- 回答日時:
こんにちは
>シート:1~31までの、セル:E1の値と★を照合する。
「照合」とは「一致するものがあるかどうか」がわかれば良いということと解釈しました。
ご質問文のように、値をそれぞれ比較してゆく方法でも可能ですけれど、有無さえわかればよさそうなので、
Set L= WorkSheets("祝日リスト").Range("B1:B20")
とでもしておいて、実際の判断は各シートに対して
n = Application.CountIf(L, WorkSheets("シート名").Range("E1"))
のようにすれば、一致する値の個数がnに得られますので、それで判断可能でしょう。
(n = 0 なら、一致するものはない)
>シートを回すロジックは理解しています。
とのことなので、上記をループできるようにすれば良いだけかと。
No.1
- 回答日時:
以下、補足要求です。
1.マクロは、ブック:AAA.xlsxではなく、他のブックに格納したいということでしょうか。(マクロをブック:AAA.xlsxに格納すると、ブック名は、AAA.xlsmになります)
2.シート:1~31のE1もyyyy/mm/dd形式で、日付が格納されていると理解しましたが、間違いないでしょうか。
3.シート:1~31についてですが、例えば2月の場合、シート:30、31のE1のセルは空白と考えて良いのでしょうか。
4.シート:祝日リストのB1~B20をfor~next文で回し、シート:1のセルE1と値を照合して、一致した場合、なにをなさりたいのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 月ごとに作成している日報ファイルを、VBAでコピーし日付ごとのシートにしたい 1 2023/11/11 08:41
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 3 2023/02/28 01:13
- Excel(エクセル) エクセル関数について 2 2022/04/13 18:25
- Excel(エクセル) エクセルで参照セルの数値を文字に変換して少数以下の桁数を表示させたい 3 2021/12/09 11:51
- Excel(エクセル) エクセルの祝日に色が反映しない 4 2022/05/18 09:58
- Visual Basic(VBA) 複数シート一括作成後に、特定範囲の数式は値で貼り付けしたい 3 2022/10/07 11:18
- その他(Microsoft Office) エクセルの休日について教えてください。 1 2023/01/06 15:45
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 1 2023/02/27 22:21
- Excel(エクセル) エクセルで”入力シート”の文字書式の変更を”出力シート”で同じ文字書式で印刷したいです。VBA希望 4 2023/04/24 11:07
- Excel(エクセル) 複数セルデータを別シートの単一セルにコピーしたい。(詳細をご参照ください) 1 2022/12/14 15:08
このQ&Aを見た人はこんなQ&Aも見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
月ごとに作成している日報ファイルを、VBAでコピーし日付ごとのシートにしたい
Visual Basic(VBA)
-
お世話になります。 Excel VBAのプログラムについてご教授をお願いいたします。 添付した写真よ
Visual Basic(VBA)
-
近似した文字列を置換するエクセル関数またはVBAについて
Visual Basic(VBA)
-
-
4
for 文の 繰り返し処理に使えるのかどうかについて
Visual Basic(VBA)
-
5
VBEを開くのにコマンド名が「Visual Basic」な理由はなぜ?
Visual Basic(VBA)
-
6
VBA 二つのブックをうまく扱えないでいます
Visual Basic(VBA)
-
7
A列B列どちらにもあるのを抽出する
Visual Basic(VBA)
-
8
擬似コード 長さがmの配列でなんで For i =0 to m とかかくの?m-1までしかないでしょ
C言語・C++・C#
-
9
VBAのことで質問です
Visual Basic(VBA)
-
10
Excelセルに入力された文字の色を変える方法を教えてください
Visual Basic(VBA)
-
11
ExcelのVBAのことで質問です。 以下のコードを入れ、ボタンを押せば作動させると写真のように画面
Visual Basic(VBA)
-
12
excelのVBAについて、以下のコードに追加をお願いいたします。
Visual Basic(VBA)
-
13
Excel VBA マクロ あるフォルダー内の複数のファイルを統合したいです
Visual Basic(VBA)
-
14
エクセルファイルのデータ転記について
Visual Basic(VBA)
-
15
VBAコードについて
Visual Basic(VBA)
-
16
エクセルVBAの配列について
Visual Basic(VBA)
-
17
バッチファイルについて
その他(プログラミング・Web制作)
-
18
エクセルのマクロについて教えてください。
Visual Basic(VBA)
-
19
VBAのコードを教えてください
Visual Basic(VBA)
-
20
VBAに関して
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
別のシートから値を取得するとき
-
ユーザーフォームに入力したデ...
-
XL:BeforeDoubleClickが動かない
-
セルの値によって、シート見出...
-
【ExcelVBA】全シートのセルの...
-
【VBA】色のついたシート名を取得
-
エクセルのシート名変更で重複...
-
ブック名、シート名を他のモジ...
-
ExcelVBA シート名を複数セルか...
-
VBAでオブジェクト変数にsetし...
-
Worksheet_Changeの内容を標準...
-
同じ作業を複数のシートに実行...
-
VBAの天才来てください
-
特定の文字を含むシートだけマ...
-
実行時エラー'1004': WorkSheet...
-
別のシートを参照して計算する方法
-
【VBA】指定した検索条件に一致...
-
ExcelのVBAのマクロで他のシー...
-
【Excel VBA】Worksheets().Act...
-
excelのマクロで該当処理できな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
別のシートから値を取得するとき
-
ユーザーフォームに入力したデ...
-
Excelマクロのエラーを解決した...
-
excelのマクロで該当処理できな...
-
同じ作業を複数のシートに実行...
-
ExcelVBA シート名を複数セルか...
-
【ExcelVBA】全シートのセルの...
-
Excel マクロについての相談
-
VBA 存在しないシートを選...
-
実行時エラー'1004': WorkSheet...
-
特定の文字を含むシートだけマ...
-
ExcelのVBAのマクロで他のシー...
-
ブック名、シート名を他のモジ...
-
XL:BeforeDoubleClickが動かない
-
VBA 複数の各シートに行を追加...
-
エクセルのシート名変更で重複...
-
【Excel VBA】Worksheets().Act...
-
シートが保護されている状態で...
-
Excel VBA 複数行を数の分だけ...
-
for 文の 繰り返し処理に使える...
おすすめ情報
ご指摘ありがとうございます。
下記回答致します
1.ご指摘通り、AAA.xlsmですね。
2.日付けで間違いありません。
3.本処理の前に、yyyy/mmを元にシートを作るロジックがあるので、31まで無い月はシートが作成されません。
4.一致したらアクティブシートを削除するのですが、そこのロジックは完成しています。
再度ご指摘ありがとうございます。
言葉足らずで申し訳ございません。
仰る通りです。
マクロ実行時にyyyy/mmの入力をします。
その値を元に、必要なシート(30までなのか、31までなのか)を作成します。
各シートのセル:E1には、yyyy/mm/ddの値が入るため、その値をもとにweekday関数で土日にヒットしたらそのシートを削除するまでは完成しています。
ただ、別シートに事前に記入した祝日の日付けと、セル:E1の値がうまく合致せず行き詰まって質問させて頂きました。
よろしくお願いいたします。
早々に回答頂きありがとうございます。返信遅くなり申し訳ございません。
セル:E1の日付けと、祝日リストの日付を照合してカウントするのではありません。
言葉足らずで申し訳ございません。
各シート(1~31)のセル:E1には、yyyy/mm/ddで日付けが入っています。
Weekday関数を使い、土日にヒットしたらそのシートを削除する。は完成しました。
ですが、祝日リストの日付けと、E1の値照合がうまくいきません。
ちゃんと祝日リストの日付けを見れてないような感じです。
そこで本質問をさせて頂きました。
よろしくお願い致します。