回答編集履歴

3

微修正

2022/11/24 01:14

投稿

pig_vba
pig_vba

スコア807

test CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  For L = 2 To lRow
15
15
  for M= 2 to mRow
16
- If wsStart.cells(L,1).value >= Sheets("goal").Cells(M, 1).value Then
16
+ If wsStart.cells(L,1).value >= wsGoal.Cells(M, 1).value Then
17
17
  MsgBox L '時刻を出したいならwsStart.cells(L,1).value
18
18
  '処理的に一行一回ずつしか表示させなくていい気がするので内側のループを飛ばす
19
19
  Exit For
@@ -41,7 +41,7 @@
41
41
 
42
42
  For each L in wsStart.Range(wsStart.cells(2,1),wsStart.cells(LRow,1)
43
43
  for M= 2 to mRow '一応、for each分は順番の保障がされてないので比較側は普通に回す
44
- If L.value >= Sheets("goal").Cells(M, 1).value Then
44
+ If L.value >= wsGoal.Cells(M, 1).value Then
45
45
  MsgBox L.value
46
46
  Exit For
47
47
  End If

2

コード修正

2022/11/24 00:54

投稿

pig_vba
pig_vba

スコア807

test CHANGED
@@ -15,6 +15,8 @@
15
15
  for M= 2 to mRow
16
16
  If wsStart.cells(L,1).value >= Sheets("goal").Cells(M, 1).value Then
17
17
  MsgBox L '時刻を出したいならwsStart.cells(L,1).value
18
+ '処理的に一行一回ずつしか表示させなくていい気がするので内側のループを飛ばす
19
+ Exit For
18
20
  End If
19
21
  nest M
20
22
  Next L
@@ -41,6 +43,7 @@
41
43
  for M= 2 to mRow '一応、for each分は順番の保障がされてないので比較側は普通に回す
42
44
  If L.value >= Sheets("goal").Cells(M, 1).value Then
43
45
  MsgBox L.value
46
+ Exit For
44
47
  End If
45
48
  nest M
46
49
  Next L

1

修正

2022/11/24 00:51

投稿

pig_vba
pig_vba

スコア807

test CHANGED
@@ -1,17 +1,20 @@
1
- 変数Mが未定義です。
1
+ 変数Mが未定義です。また、Lはただの行数を表す数値なので時刻比較をしたいならば正しいとは言えません。
2
2
 
3
3
  ```ここに言語を入力
4
4
  Sub compare_date()
5
5
 
6
6
  Dim L as long , lRow as long, M as long, mRow As Long
7
7
 
8
+ dim wsStart as worksheet:set wsStart=thisworkbook.Sheets("start")
9
+ dim wsGoal as worksheet:set wsGoal=thisworkbook.Sheets("goal")
10
+
8
- lRow = Sheets("start").Cells(Rows.Count, "A").End(xlUp).Row '日付データの最終行
11
+ lRow = wsStart.Cells(Rows.Count, "A").End(xlUp).Row '日付データの最終行
9
- mRow = Sheets("goal").Cells(Rows.Count, "A").End(xlUp).Row '比較先の日付データの最終行
12
+ mRow = wsGoal.Cells(Rows.Count, "A").End(xlUp).Row '比較先の日付データの最終行
10
13
 
11
14
  For L = 2 To lRow
12
15
  for M= 2 to mRow
13
- If L >= Sheets("goal").Cells(M, "A") Then
16
+ If wsStart.cells(L,1).value >= Sheets("goal").Cells(M, 1).value Then
14
- MsgBox L
17
+ MsgBox L '時刻を出したいならwsStart.cells(L,1).value
15
18
  End If
16
19
  nest M
17
20
  Next L
@@ -19,3 +22,30 @@
19
22
  End Sub
20
23
  ```
21
24
  範囲セル指定でfor each を使う場合は変数にrangeオブジェクトが代入されるためrange型でないとエラーが出るのが原因です(variantは自動解釈してくれるので問題ありませんが、Long型だと型違いでエラーが出たということです)
25
+
26
+ for eachを使う場合
27
+ ```ここに言語を入力
28
+ ```ここに言語を入力
29
+ Sub compare_date()
30
+
31
+ Dim L as Range , lRow as long,
32
+ Dim M as Range, mRow As Long
33
+
34
+ dim wsStart as worksheet:set wsStart=thisworkbook.Sheets("start")
35
+ dim wsGoal as worksheet:set wsGoal=thisworkbook.Sheets("goal")
36
+
37
+ lRow = wsStart.Cells(Rows.Count, "A").End(xlUp).Row '日付データの最終行
38
+ mRow = wsGoal.Cells(Rows.Count, "A").End(xlUp).Row '比較先の日付データの最終行
39
+
40
+ For each L in wsStart.Range(wsStart.cells(2,1),wsStart.cells(LRow,1)
41
+ for M= 2 to mRow '一応、for each分は順番の保障がされてないので比較側は普通に回す
42
+ If L.value >= Sheets("goal").Cells(M, 1).value Then
43
+ MsgBox L.value
44
+ End If
45
+ nest M
46
+ Next L
47
+
48
+ End Sub
49
+ ```
50
+ ただ、同じ時刻のデータがあるかどうかを比較するならばVBAにもDictionaryがあるのでこちらを使ったほうが簡潔で便利だと思います。
51
+ https://daitaideit.com/vba-dictionary/