- ベストアンサー
連続するセルの比較をしたいのですが、(型が一致しません)のエラーが出ます。
下記のどの部分でエラーになるのか、お教えください よろしくお願いします。 Sub CellsSamp() Sheets("sheet3").Select If Range(Cells(5, 1), Cells(5, 6)) = Range(Cells(5, 8), Cells(5, 25)).Value Then Range(Cells(6, 1), Cells(6, 6)) = Range(Cells(5, 1), Cells(5, 6)).Value End If End Sub
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
Sub てすと() Dim strX(7) '元データの配列 Dim strA(13) '比較データの配列 Dim strY '配列をつなげた文字列(元) Dim strB '配列をつなげた文字列(比較) Dim i, n 'ループ用 '(5,1)-(5,6)までの文字列配列と '(5,8)-(5,13)までの文字列配列を作る。 For i = 1 To 6 strX(i) = Cells(5, i).Value n = i + 7 strA(n) = Cells(5, n).Value Next strY = Trim(Join(strX)) strB = Trim(Join(strA)) 'それぞれの文字列を比較。 'OKなら(7,1)-(7,6)まで数値を入れる。 If strY = strB Then strX(7) = Split(strY) For i = 1 To 6 Cells(7, i).Value = strX(i) Next Else MsgBox "だめ" End If End Sub JoinとSplitが好きなんで、一度配列を作って、 配列ごと比較するアルゴリズムにしました。 動作するのは確認しました。 一文字ずつ比較するやりかたもありますけど。
その他の回答 (7)
- BlueRay
- ベストアンサー率45% (204/453)
遅くなったので、既に回答は出ているようですね。 一応、当方の回答を書いておきます。 当方は、Instr関数をよく使用するのでInstrを使用した例です。 Sub CellsSamp() Dim i As Integer 'ループ用 Dim bStart As Long, bEnd As Long '比較対照元開始・終了 Dim tStart As Long, tEnd As Long 'ターゲット開始・終了 Dim bStr As String '比較対照元文字列 Dim tStr As String 'ターゲット文字列 bStart = 1 bEnd = 6 tStart = 8 tEnd = 25 '比較対照元範囲のセルの内容を1文字列として結合 For i = bStart To bEnd bStr = bStr & Cells(5, i) Next 'ターゲット範囲のセルの内容を1文字列として結合 For i = tStart To tEnd tStr = tStr & Cells(5, i) Next 'ターゲット文字列中に比較対照元文字列が含まれるかチェック '含まれていれば、開始位置が帰ってきて含まれていなければ0 If InStr(tStr, bStr) > 0 Then Range(Cells(6, bStart), Cells(6, bEnd)) = Range(Cells(5, bStart), Cells(5, bEnd)).Value End If End Sub
お礼
BlueRayさん 大変詳しく御回答いただきまして 有難うございます。皆様の回答を参考にさせていただき、 さらに勉強させていただきます。 本当に有難う御座いました。
- taisuke555
- ベストアンサー率55% (132/236)
#2と#3です。 解決済みのようですが、くだらない回答しかしていなかったので、 私も1つサンプルを作りました。 参考になれば幸いです。 Sub test() Dim Rn As Range Dim Flg As Boolean 'チェックフラグ Flg = True '最初は全て一致している事にする For Each Rn In Range(Cells(5, 1), Cells(5, 6)) 'For Each Rn In Range("A5:F5") 'こちらでも同じ If (Rn.Value <> Rn.Offset(, 7).Value) Then 'セルを比較 'Offset(,7)・・・Rnのセルの右へ7つ移動した場所 Flg = False '一致しない場合にフラグを変更 Exit For 'ループを抜ける End If Next Rn If (Flg) Then '一致していたら(Trueならば) Range(Cells(7, 1), Cells(7, 6)) = Range(Cells(5, 1), Cells(5, 6)).Value Else MsgBox "一致していません" End If End Sub #6さんの回答に似ていますが、こちらは先にチェックのみ行い、 後からチェック後の処理をしています。
お礼
taisuke555さん 大変ご丁寧にご回答を下さり感激しています。皆さんのご親切に感謝々です。 本当に有難う御座いました。
- norakuma
- ベストアンサー率29% (293/977)
#5です。 今度は一文字ずつのやりかたです。 #問題があるので、気をつけてください。 Sub てすと() Dim i, n For i = 1 To 6 n = i + 7 If Cells(5, i).Value = Cells(5, n).Value Then Cells(7, i).Value = Cells(5, i).Value Else Exit For End If Next End Sub これは、一致する限り一文字ずつ代入します。 一致しない場所でループを抜けますが、それまでの値は記入されます。 したがって、次のどちらかの回避策を組み込む必要があります。 1.どこか別の場所に値を保持して、最後までループが回ったかを確認して、一気にコピーする。 2.途中で一致しなくなったら、それまでに代入した値を全部削除。 これが面倒なら、配列単位で比較して値をセットする、この前のやりかたがよいです。
- BlueRay
- ベストアンサー率45% (204/453)
If Range(?, ?).Value = Range(?, ?).Value Then ↑条件比較は不可能です。 Range(?, ?).Value = Range(?, ?).Value ↑値の代入は可能です。 ※要するに、Range(?, ?).Valueを見ることは出来ません。 それでは、ここからが本題です。 具体的にどのようなことがしたいのでしょうか? 例えば、 Cells(5, 1) = "A" Cells(5, 2) = "B" Cells(5, 3) = "C" Cells(5, 4) = "D" Cells(5, 5) = "E" Cells(5, 6) = "F" として Range(Cells(5, 1), Cells(5, 6))は、"ABCDEF"と見えているとします。 そして、やりたいことは Range(Cells(5, 8), Cells(5, 13))の範囲に"ABCDEF"と言う並びでの有無をIf文でチェックしたいと言うことでよろしいのでしょうか? 根本的に今の文では解決できないので、やりたいことをもう少しわかりやすく補足していただければ別な方法での回答が得られるようになると思いますよ。
補足
BlueRayさん 大変ご親切な回答有難うございます。 初心者で申し訳ありません。 ご指摘のように、Cells(5,1)~Cells(5,6)に"A,B,C,D,E,F" Cells(5,8)~Cells(5,13)に"A,B,C,D,E,F"と、ある時 IF文でチェックして同じなら、Cells(7,1)~Cells(7,6)に "A,B,C,D,E,F"を表示したいのです。 ぜひ ご教示ください。
- taisuke555
- ベストアンサー率55% (132/236)
どんなエラーかタイトルに書いてありましたね。 失礼しました。
お礼
taisuke555さん 有難うございました。 色々試行錯誤を繰り替えしていますが、なかなか完成しません。 これからもよろしくお願いします。
- taisuke555
- ベストアンサー率55% (132/236)
If Range(Cells(5, 1), Cells(5, 6)) = Range(Cells(5, 8), Cells(5, 25)).Value Then この書き方ができるのかどうかは未確認ですが、 (1)比較するセルの大きさが違いますよね? (2)後半のRangeには.Valueがありますが、 前半にはないですよね? これは、意図的に記述しているのでしょうか? どんなエラーが出るのかも書くと回答者も答えやすいと思いますよ。
- kojitti
- ベストアンサー率32% (449/1386)
ここで出ています。 If Range(Cells(5, 1), Cells(5, 6)) = Range(Cells(5, 8), Cells(5, 25)).Value Then ステップ実行(F8キー押下)させてばどこでエラーになっているかすぐわかりますよ。
補足
kojittiさん、早速の回答ありがとうございます。 質問文が足りませんでした。 If Range(Cells(5, 1), Cells(5, 6)) = Range(Cells(5, 8), Cells(5, 25)).Value Then エラーの部分をどの様に修正したら良いかお教えください。
お礼
norakumaさん 大変すばらしい御回答をいただき有難う ございました。早速テストさせていただき思っている動作が出来て感激です。 本当に有難うございます。