【お題】王手、そして

中身はとても簡易的なもので,あるセルの文字列に対して対象の文字列が部分一致していれば抽出するというものなのですが,どうもプロシージャ名の部分で,"変数が定義されていません"と出てしまいます。恐らく初歩的なことだとは思いますが全く気づけないのでわかる方は教えて頂けると助かります。

コードは下記です。

Option Explicit
Sub test()
Dim myRange As Range
Dim myObj As Range
Dim keyWord As String
Dim i, j As Integer

Set myRange = Range("B:B")
i = 2
j = 2
Do While i <= 100
keyWord = Cells(A, i)
Set myObj = myRange.Find(keyWord, LookAt:=xlPart)

If myObj Is Nothing Then
i = i + 1
Else
Cells(C, j) = myObj
j = j + 1
End If
Loop
End Sub

A 回答 (4件)

A列の11文字がB列にあるか?


ということなら。

Option Explicit
Sub test()
Dim myRange As Range
Dim myObj As Range
Dim fstRange As Range
Dim keyWord As String
Dim i As Long, j As Long, iMax As Long

Set myRange = Range("B:B")
i = 2
j = 2
iMax = Cells(Rows.Count, "A").End(xlUp).Row
Do While i <= iMax
keyWord = Left(Cells(i, "A").Value, 11)
If myObj Is Nothing Then
Set myObj = myRange.Find(keyWord, LookAt:=xlPart)
Set fstRange = myObj
Else
Set myObj = myRange.Find(keyWord, myObj, LookAt:=xlPart)
If myObj.Row = fstRange.Row Then Set myObj = Nothing
End If
If myObj Is Nothing Then
i = i + 1
Else
Cells(j, "C").Value = myObj.Value
j = j + 1
End If
Loop
End Sub
    • good
    • 0

こんにちは



>どうもプロシージャ名の部分で,"変数が定義されていません"と出てしまいます。
全体の構文チェックに引っかかる場合、プロシージャ名の部分が反転します。
ですので、必ずしもその行でエラーが発生しているわけではありません。

実際の原因は(既に指摘がでていますが)
>Cells(A, i)
>Cells(C, j)
の部分で、「A」、「C」は変数とみなされます。
(i、j と同様ですね)

>Option Explicit
の宣言があるのに対して、変数A、Cの宣言がされていないので、「変数が定義されていません」というエラーメッセージになっているものと考えられます。


もしも列番号を指定したいのなら、1、3 とするか、"A"、"C"とするかですが、Cellsの場合の引数は(行番号、列番号)の順と決まっているので、
 Cells(i, 1)
または
 Cells(i, "A")
などとしておく必要があります。
あるいは、A1形式の方がお馴染みであるのなら、
 Range("A" & i)
のような記述にしておくかでしょうか。
    • good
    • 0

こんなことがしたいのかな?



Option Explicit
Sub test()
Dim myRange As Range
Dim myObj As Range
Dim fstRange As Range
Dim keyWord As String
Dim i As Long, j As Long, iMax As Long

Set myRange = Range("B:B")
i = 2
j = 2
iMax = Cells(Rows.Count, "A").End(xlUp).Row
Do While i <= iMax
keyWord = Cells(i, "A").Value
If myObj Is Nothing Then
Set myObj = myRange.Find(keyWord, LookAt:=xlPart)
Set fstRange = myObj
Else
Set myObj = myRange.Find(keyWord, myObj, LookAt:=xlPart)
If myObj.Row = fstRange.Row Then Set myObj = Nothing
End If
If myObj Is Nothing Then
i = i + 1
Else
Cells(j, "C").Value = myObj.Value
j = j + 1
End If
Loop
End Sub
    • good
    • 0
この回答へのお礼

ご丁寧な回答ありがとうございます。
恐らくそのような認識で間違いないと思うのですがどうもうまく動いてくれず…。

A列に例えば日時のような220219-142230のような文字列があり,B列にも同じような文字列がある状態で,日付と分単位まで一致しており,秒単位は問わずに分単位までで一致したもの(要するにそこまでの文字列が重複したもの)をC列に並べていきたいといった内容になっております。

この前提の場合だと現在の書き方では難しいのでしょうか…??

お礼日時:2022/02/19 14:26

こんにちは。



デバッグのコンパイルをされれば、どこでエラーが出るかが分かるかと。
https://www.excelspeedup.com/vbadebug/

下記の2か所が原因になりますね。

誤り      正しくは
Cells(A, i) → Cells("A", i) 又は、Cells(1, i)
Cells(C, j) → Cells("C", j) 又は、Cells(3, j)
    • good
    • 0
この回答へのお礼

ありがとうございます。久しぶりに記述したので完全に忘れてました。。

お礼日時:2022/02/19 14:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報