こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

連続するセルの比較をしたいのですが、(型が一致しません)のエラーが出ます。

 下記のどの部分でエラーになるのか、お教えください
よろしくお願いします。 


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

投稿日時 - 2003-08-14 23:38:02

QNo.628046

困ってます

質問者が選んだベストアンサー

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が好きなんで、一度配列を作って、
配列ごと比較するアルゴリズムにしました。
動作するのは確認しました。

一文字ずつ比較するやりかたもありますけど。

投稿日時 - 2003-08-15 16:43:12

お礼

norakumaさん 大変すばらしい御回答をいただき有難う
ございました。早速テストさせていただき思っている動作が出来て感激です。
本当に有難うございます。

投稿日時 - 2003-08-15 17:10:15

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.8

遅くなったので、既に回答は出ているようですね。
一応、当方の回答を書いておきます。
当方は、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

投稿日時 - 2003-08-15 18:14:53

お礼

BlueRayさん 大変詳しく御回答いただきまして
有難うございます。皆様の回答を参考にさせていただき、
さらに勉強させていただきます。
本当に有難う御座いました。

投稿日時 - 2003-08-15 18:21:19

ANo.7

#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さんの回答に似ていますが、こちらは先にチェックのみ行い、
後からチェック後の処理をしています。

投稿日時 - 2003-08-15 18:01:26

お礼

taisuke555さん 大変ご丁寧にご回答を下さり感激しています。皆さんのご親切に感謝々です。
本当に有難う御座いました。

投稿日時 - 2003-08-15 18:14:50

ANo.6

#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.途中で一致しなくなったら、それまでに代入した値を全部削除。

これが面倒なら、配列単位で比較して値をセットする、この前のやりかたがよいです。

投稿日時 - 2003-08-15 16:58:11

ANo.4

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文でチェックしたいと言うことでよろしいのでしょうか?

根本的に今の文では解決できないので、やりたいことをもう少しわかりやすく補足していただければ別な方法での回答が得られるようになると思いますよ。

投稿日時 - 2003-08-15 12:03:03

補足

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"を表示したいのです。
ぜひ ご教示ください。

投稿日時 - 2003-08-15 14:27:29

ANo.3

どんなエラーかタイトルに書いてありましたね。
失礼しました。

投稿日時 - 2003-08-15 01:14:38

お礼

taisuke555さん
有難うございました。 色々試行錯誤を繰り替えしていますが、なかなか完成しません。 これからもよろしくお願いします。

投稿日時 - 2003-08-15 07:00:39

ANo.2

If Range(Cells(5, 1), Cells(5, 6)) = Range(Cells(5, 8), Cells(5, 25)).Value Then

この書き方ができるのかどうかは未確認ですが、
(1)比較するセルの大きさが違いますよね?
(2)後半のRangeには.Valueがありますが、
   前半にはないですよね?
これは、意図的に記述しているのでしょうか?

どんなエラーが出るのかも書くと回答者も答えやすいと思いますよ。

投稿日時 - 2003-08-15 00:55:44

ANo.1

ここで出ています。
If Range(Cells(5, 1), Cells(5, 6)) = Range(Cells(5, 8), Cells(5, 25)).Value Then

ステップ実行(F8キー押下)させてばどこでエラーになっているかすぐわかりますよ。

投稿日時 - 2003-08-15 00:49:42

補足

kojittiさん、早速の回答ありがとうございます。
質問文が足りませんでした。

If Range(Cells(5, 1), Cells(5, 6)) = Range(Cells(5, 8), Cells(5, 25)).Value Then

エラーの部分をどの様に修正したら良いかお教えください。

投稿日時 - 2003-08-15 06:39:42

あなたにオススメの質問