- 締切済み
【VBA】findの検索条件における制限について
すみません、教えてください。 例) Range("XX" & YY).Find(what:=文字A, lookAt:=xlWhole) ↑のような感じで完全一致で検索したいのですが、 実行するとエラーコード13のエラーが出てしまいました。 実行時エラー'13' 型が一致しません。 調べてみたのですが、VBAの本にはfindのwhatはVariant型と書いてあり、 Variant型が16バイトという記載がありました。 例文の“=文字A”には30バイトの文字列が入っている事がわかりました。 文字数を減らした所うまく通ったのでこれが原因と考えているのですが、 もし、対処方法があれば教えていただきたいです。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
>セルの中は以下のように改行コード付で文字列が並んでいます。 例) AAAAA BBBBB CCCCC セルの値は ”AAAAA" & Chr(10) & "BBBBB" & Chr(10) & "CCCCC" のようになっているのではないですか。 それを "AAAAABBBBBCCCCC"で検索している不都合では。 Whatに書くもの《検索文字列)がつくりにくくて、プログラムが缶単位はいかず絶望かな。 セル内改行のコード文字を取り除いた列を作業列で作る必要があるのでは。 >Variant型が16バイトという記載がありました こんなのは変数のメモリ領域の長さと、その指し示すデータの桁数・文字数との区別が付かない、誤りだと思う。
- end-u
- ベストアンサー率79% (496/625)
>※例なので3行にしましたがエラーが出た時は10行前後ありました >この場合も同様なのでしょうか? 『同様』に255文字制限か?..という意味だったら同様です。 >Set BBB = Range("XX" & YY).Find(what:=AAA, lookAt:=xlWhole) 実際のコードですか? "XX"とはXX列の事で、変数YYで行を指定してる? その場合は検索範囲が単独セルなのですが? #仮にそうだとしても、その行でエラーが出るわけではない。 他に、型不一致エラーが出る例としては Range("B1").Activate '適当 Set AAA = Range("A1") Set BBB = Range("XX" & YY).Find(what:=AAA, after:=ActiveCell, lookAt:=xlWhole) 引数afterに検索範囲外を指定してしまった場合。 それ以外、Range("A1")がエラー値の場合、など考えられます。 >エラーが出た時のコードをそのままUPすることができないのですが、 >同じ事象が再現できるか検証してみます。 『文字数を減らした所うまく通った』のなら、文字数を元に戻してみてどうなのか、 エラーなら、その時の文字数が何文字か、確認してみると良いのでは。
- Wendy02
- ベストアンサー率57% (3570/6232)
>例文の“=文字A”には30バイトの文字列が入っている VBAのString 型のバイト数は数え方が特殊ですから、VB.Net のようには行かないです。 確かに、VBAでは、Unicodeですから、一文字、2byte にはなりますが、String型は、予めメモリを使っています。 MatchCase '大文字・小文字の区別 MatchByte '半角と全角を区別 今回、全体的なコードをみないわけには、何とも言えませんね。たふん、見つからなかった場合の処理の仕方とかの問題があるのだと思います。言葉で言っても通じないかもしれませんから、サンプルコードを出しておきます。 '// Sub TestFind() Dim strTxt As Variant Dim c As Range Const sCOL As String = "A" strTxt = "あいうえおかきくけこさしすせそ*" Set c = Range(sCOL & "1").EntireColumn.Find( _ What:=strTxt, _ LookIn:=xlValues, _ LookAt:=xlWhole) If c Is Nothing Then MsgBox "Not Found", vbExclamation Else c.Select Beep End If End Sub
- end-u
- ベストアンサー率79% (496/625)
ExcelのFindメソッドで、完全一致検索に制限があるのは確かですが、 それは「検索する文字列が255文字まで」というものです。 >例文の“=文字A”には30バイトの文字列が入っている事がわかりました。 これが15文字~30文字の文字列の長さの事でしたら、 制限内ですので型不一致エラーは別の要因です。 >↑のような感じで完全一致で検索したいのですが、 感じではなくて実際にエラーが出るコードの提示があれば 他の方からも追加アドバイスがあるかもしれません。 ちなみに >Variant型が16バイトという記載がありました。 ヘルプの『データ型の概要』を参照してみてください。 >データ型 記憶領域のサイズ 範囲 >: >バリアント型 (Variant) (数値) 16 バイト 倍精度浮動小数点数型の範囲と同じ。 Variant型変数の中に数値を格納した時の Variant型の記憶領域のサイズが16バイトである、という意味です。
お礼
回答ありがとうございます。 >ExcelのFindメソッドで、完全一致検索に制限があるのは確かですが、 >それは「検索する文字列が255文字まで」というものです。 > >>例文の“=文字A”には30バイトの文字列が入っている事がわかりました。 >これが15文字~30文字の文字列の長さの事でしたら、 >制限内ですので型不一致エラーは別の要因です。 なるほど16バイトというわけでなく255文字まで可能なのですね 最初に書くべきでしたが、エラーが出た時はセルの中身を変数に格納して Set AAA = Range("A1") Set BBB = Range("XX" & YY).Find(what:=AAA, lookAt:=xlWhole) で一致したセルを別の変数に入れる処理をやっていました。 セルの中は以下のように改行コード付で文字列が並んでいます。 例) AAAAA BBBBB CCCCC ※例なので3行にしましたがエラーが出た時は10行前後ありました この場合も同様なのでしょうか? >>Variant型が16バイトという記載がありました。 >ヘルプの『データ型の概要』を参照してみてください。 ありがとうございます。確認してみます。 >Variant型変数の中に数値を格納した時の >Variant型の記憶領域のサイズが16バイトである、という意味です。 ありがとうございます。数値の場合という事だったのですね。 >>↑のような感じで完全一致で検索したいのですが、 >感じではなくて実際にエラーが出るコードの提示があれば >他の方からも追加アドバイスがあるかもしれません。 そうですね、すこし情報が少なかったです。 エラーが出た時のコードをそのままUPすることができないのですが、 同じ事象が再現できるか検証してみます。
- layy
- ベストアンサー率23% (292/1222)
参考。 とあるセルの1つ下は何? 2つ下は何?、 3つ下は何?、 と移動させながら確認ならOFFSETを学習。 とあるセルに"ABC"があるかないかはINSTR関数も使えるので学習。
お礼
回答ありがとうございます。 INSTR関数というのもあるのですね。 もう少しいろいろと試してみます。
お礼
回答ありがとうございます。 サンプルはありがたいです。 実は昨日初めてVBAを触って他人が作ったコードのデバックをやっていたのです。。。 頂たサンプルとの違いを思い出しながらもう少し試して見ます。