エクセルのVBAを勉強中なのですがコードが分からないのでアドバイスをお願いします。
やりたいことは確認シートのE2とG2に入力された日付の範囲内で出勤した日数がE3とG3で入力された日数出勤してる人だけを抽出してそのシート名を確認シートのA2からA3・A4・・・と返したいです。以下書いてみたコードです。これだと1週目と2週目に3日出勤した人は2回名前が載ることになってしまいます。2週目だけや3週目だけ○日出勤した人を抽出するにはどうしたらいいでしょうか。よろしくお願いします。
※1週間ごとに出勤した日数は計算されます。例えば、Aさんのシートの10/1~10/7まで欄にシフトを入力するとAさんのシートのJ9:J13の結合されたセルに勤務日数が返ります。
※第2週(10/8~10/14まで)のシフトを入力するとJ16:J20の結合セルに出勤日数が返ります
※Aさん以下B・C・D・・・と同じシートです。
【コード】
Sub 出勤日数()
Dim i As Long
Dim keyword As String
Dim lastrow As Long
keyword = Worksheets("確認").Cells(3, 5).Value
For i = 1 To Worksheets.Count
If Worksheets(i).Name <> "確認" Then
For 日付行1 = 9 To 36
If Worksheets(i).Cells(日付行1, 10).Value = keyword Then
Worksheets("確認").Activate
lastrow = Worksheets("確認").Cells(Rows.Count, 1).End(xlUp).row
Worksheets("確認").Cells(lastrow + 1, 1).Value = Worksheets(i).Name
End If
Next 日付行1
End If
Next i
End Sub
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
ここは 受託コーディングではないということになっているのだそうです。
変数をアルファベットで書くのが普通ですが、漢字なども使えます。
Set で、シートやRANGEなどの、オブジェクトを指定すると、便利なことも多いです。
一致を個々にチェックする以外に、目的によっては、CountIfを利用する方法もあります。
例えば、月曜から日曜の7日間ごとの勤務日数を対象として、その日数が行を結合したセルに表示されている場合には、《確認シートのE2とG2に入力された日付の範囲内》という指定の解釈が、かなり難しいです。(E2が水曜日で、G2が翌週の木曜日)の場合、その9日間には、(月曜から日曜の7日間)は1つもないです。 《確認シートのE2とG2に入力された日付の範囲内》でチェックするのはどこなのかを決めるルールを作る必要があります。Sampleは、その一例です。
また、各人のシートの様式(記入欄やセル結合の仕方)が同じでも、人によって、9行目から始まる日付が、ある人は8月1日から、別の人は4月1日からというように違っていた場合もあると思います。 そうしたことも一応考えないといけないように思います。
Sub sample()
Dim 始期日, 終期日, 初日, 終日, 指定1, 指定2, 名前, 確認S
Dim 始行, 終行, 範囲, 当否
Dim s, n ' これら Dim の宣言はなくても可
Set 確認S = Worksheets("確認")
s = 9: n = 7 'sは各人の日付の始まる行No. nは1週の日数(=結合セルの行数)
確認S.Activate
始期日 = Cells(2, 5): 終期日 = Cells(2, 7)
指定1 = "=" & Cells(3, 5): 指定2 = "=" & Cells(3, 7)
確認S.Columns("A:A").Clear
確認S.Cells(1, 1) = "シート名"
For i = 1 To Worksheets.Count
If Worksheets(i).Name <> "確認" Then
With Worksheets(i)
初日 = .Cells(s, 2): 始行 = s
If (初日 < 始期日) Then 始行 = s + Int((始期日 - 初日 + 1) / n + 1) * n
終日 = .Cells(s, 2).End(xlDown)
終行 = s + (Int((終日 - 初日 + 1) / n)) * n
If (終期日 < 終日) Then 終行 = s + Int((終期日 - 初日 + 1) / n - 1) * n
Set 範囲 = Range(.Cells(始行, 10), .Cells(終行, 10))
当否 = WorksheetFunction.CountIf(範囲, 指定1) + _
WorksheetFunction.CountIf(範囲, 指定2) > 0
If 当否 Then 確認S.Cells(500, 1).End(xlUp).Offset(1) = .Name
End With
End If
Next
End Sub
No.2
- 回答日時:
というかそもそも結合しているんだから「9~36」全部を見る必要ない
ですよね。
Const shtName As String = "確認"
Dim i As Long
Dim keyword As String
Dim lastrow As Long
Dim wkNum As Integer
With Worksheets(shtName)
keyword = .Range("E3").Value
.Range("A:A").ClearContents
.Range("A1").Value = "シート名"
lastrow = 2 'というか開始行
wkNum = 2 '第二週を対象にする
End With
For i = 1 To Worksheets.Count
If Worksheets(i).Name <> shtName Then
If Worksheets(i).Cells(wkNum * 7 + 2, 10).Value = keyword Then
Worksheets(shtName).Cells(lastrow, 1).Value = Worksheets(i).Name
lastrow = lastrow + 1
End If
End If
Next i
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
許せない心理テスト
私は「あなたの目の前にケーキがあります。ろうそくは何本刺さっていますか」と言われ「12本」と答えたら…
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
エクセルのVBAで日付を検索し転機したい
Visual Basic(VBA)
-
VBA 別シートの同じ日付の欄に値を貼付け
Excel(エクセル)
-
Excelにて、ユーザーフォームで、日付けの範囲を指定し、検索しデーターを抽出し 別シートへ転記した
Excel(エクセル)
-
-
4
(VBAにて)日付でデータを抽出するやり方
Excel(エクセル)
-
5
Excelで日付変更ごとに、自動的にデータを転記
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで入力シートから別シ...
-
Excel 複数のシートからグラフ...
-
VBA セルの値と同じ名前のシー...
-
エクセル シフト勤務表から、...
-
ExcelVBAで、指定したシートに...
-
エクセルのワークシートが重く...
-
エクセルで入力→日付を自動判別...
-
エクセルについて質問です 日付...
-
IF, ISNUMBER, INDIRECTの組み...
-
質問:特定文字列から空白行ま...
-
エクセルのシートを自動で
-
VBAのoffsetの動き方について教...
-
エクセルVBAで
-
エクセルVBA:表の内容を担当者...
-
該当するデータを書式設定ごと...
-
EXCEL VBA 一致しないデータの...
-
各顧客をシートごとに作成した...
-
Excelで数値→文字列変換で指数...
-
テキストボックス内の文字のふ...
-
Excelで行ごとコピー、同じ行を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelの中央値の複数条件について
-
エクセルで入力シートから別シ...
-
VBA セルの値と同じ名前のシー...
-
Excel 複数のシートからグラフ...
-
ExcelVBAで、指定したシートに...
-
エクセルのワークシートが重く...
-
エクセル マクロを使って日々...
-
IF, ISNUMBER, INDIRECTの組み...
-
エクセルVBA:表の内容を担当者...
-
エクセルについて質問です 日付...
-
Excel ハイパーリンク先のセル...
-
質問:特定文字列から空白行ま...
-
【Excel】VLOOKUP関数で複数の...
-
該当するデータを書式設定ごと...
-
Excelの選択肢をポップアップリ...
-
エクセルで入力→日付を自動判別...
-
エクセル自動の年月
-
VBAのoffsetの動き方について教...
-
VBAを利用しオートフィルタで日...
-
エクセル シフト勤務表から、...
おすすめ情報
早速のお返事ありがとうございます。試してみたのですが、E2とG2の日付の範囲内でデータが検索されていないように思えたのですがどうすればいいでしょうか。
早速のお返事ありがとうございます。実際にやってみたのですが【 終行 = s + (Int((終日 - 初日 + 1) / n)) * n】の部分にエラーが出てしまいます。
また補足になりますがすべての人が同じサイクルで日付は書いてあります。例えばB9にはすべての人が9月28日の日付が入っていて以下B36まで連続した日付が並んでいてB36は10月25日になります。翌月にはB9は全員10月26日になりB36は11月22日になります。VBAを勉強中の初心者故に質問ばかりになりますがよろしくお願いします。