• ベストアンサー

エクセルの文字数カウントに関して

エクセル初心者なのでお恥ずかしい質問かもしれませんが、ご協力よろしくお願いいたします。 A列   B列   C列 123   124   1 122   122   0 124   12    1 上記のようにA列・B列を比較して、違う文字の文字数をC列に 出したいのですが、どうもうまくいきません。 よろしくお願いいたします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 はっきりとした法則性は見出せませんでしたが、今回は、見切ってしまいます。 それで、以下のような数式でできるよな気がします。ただし、256文字までです。 =IF(LEN(A1)<LEN(B1),ABS(LEN(A1)-LEN(B1)),0)+SUMPRODUCT((MID(A1,ROW($A$1:$A$256),1)<>MID(B1,ROW($A$1:$A$256),1))*1) 別途、ユーザー定義関数を作ってみました。 標準モジュールに貼り付けて、後は、一般の関数と同じように使います。 ------------------------------------------------ Function CompStr(rng1 As Range, rng2 As Range)   Dim i As Integer, j As Integer   Dim cnt As Integer   Dim w1 As String   Dim w2 As String   '文字の比較・TextCompare は、全角・半角同等   Const CP As Integer = vbTextCompare 'vbBinaryCompare   If Len(rng1.Value) >= Len(rng2.Value) Then     w1 = rng1.Value: w2 = rng2.Value   Else     w2 = rng1.Value: w1 = rng2.Value   End If   If StrComp(w1, w2) <> 0 Then     For i = 1 To Len(w2)       j = StrComp(Mid(w1, i, 1), Mid(w2, i, 1), CP)       If j <> 0 Then         cnt = cnt + 1       End If     Next i     cnt = cnt + Len(w1) - Len(w2)   End If   CompStr = cnt End Function ------------------------------------------------ #1さんの修正部分を指摘しておきます。  i を r に換えれば可能だと思います。   a = Range("A" & r).Cells 'A列のデータを取得 If a = "" Then Exit Do 'A列が空なら終了 b = Range("B" & r).Cells 'B列のデータを取得

tsuka_kana
質問者

お礼

どうもありがとうございました! うまくいきました!

その他の回答 (4)

noname#204879
noname#204879
回答No.5

お示しのデータが Sheet1 のセル A1 から並んでいると仮定します。 1.Sheet2 のセル A1 に式 =MID(Sheet1!$A1,COLUMN(A1),1) を入力し   て、此れを右方(此処では列Gまでとしておく)および下方にズズ   ーッとドラッグ&ペースト(右方の列数は Sheet1 のA列の最大桁   数以上) 2.Sheet3 のセル A1 に式 =MID(Sheet1!$B1,COLUMN(A1),1) を入力し   て、此れを右方(此処では列Gまで)および下方にズズーッとドラ   ッグ&ペースト 3.Sheet1 のセル C1 に次の配列数式を入力して、此れを下方にズズ   ーッとドラッグ&ペースト   {=SUM(NOT(Sheet2!A1:G1=Sheet3!A1:G1)+0)}

tsuka_kana
質問者

お礼

どうもありがとうございました。 おかげさまで、無事に解決する事ができました。

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.4

一例です Sub test() Dim i As Integer, ii As Integer, iii As Integer Dim a As String, b As String Dim c As Integer For i = 1 To Range("a65536").End(xlUp).Row ii = Len(Cells(i, 1).Value) a = Cells(i, 1).Value b = Cells(i, 2).Value c = 0 For iii = 1 To ii If InStr(iii, b, Mid(a, iii, 1)) <> iii Then c = c + 1 Next iii Cells(i, 3).Value = c Next i End Sub 参考になれば

tsuka_kana
質問者

お礼

ありがとうございました。 参考にさせて頂きます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 ご質問を読む限りは、VBAでないと無理ではないかと思います。 きちんと確認してほしいことがあります。 >違う文字の文字数をC列に 例えば  A    B    C 123   312   0  同じ 212   122   0  同じ 1111  312    3 A側からみれば、3 です。 そういう考え方でよいのでしょうか。

tsuka_kana
質問者

補足

こんにちは。 A列が基準になりますので、 >例えば > A    B    C >123   312   0  同じ この場合C列→3 >212   122   0  同じ この場合C列→2 >1111  312    3 A側からみれば、3 です。 になります。 よろしくお願いいたします。

回答No.1

文字を比較する関数はありますが、何文字違うかを返す関数は無いと思いますので、VBAによる操作になると思います。 1.表示 → ツールバー → コントロールボックス 2.コントロールボックスのツールバーが表示されたら、その中のコマンドボタン(ボタンの絵のやつ)をクリックします。 3.ワークシートの上でマウスをドラッグして適当な大きさのボタンを配置します。 4.配置したボタンをダブルクリックします。 5.別のウィンドウが開くので以下の内容を入力します。 Private Sub CommandButton1_Click() Dim a As String, b As String Dim r As Long Dim j As Integer, k As Integer Dim count As Integer i = 0 j = 0 k = 0 Do While (1) r = r + 1 '行カウンタ count = 0 '検査結果の初期化 a = Range("A" & i).Cells 'A列のデータを取得 If a = "" Then Exit Do 'A列が空なら終了 b = Range("B" & i).Cells 'B列のデータを取得 If a <> b Then 'A列とB列のデータが違う場合 If Len(a) > Len(b) Then 'Aの方が長い場合 調べる文字数=Bの文字数 k = Len(b) Else 'Bの方が長いか同じ場合 調べる文字数=Aの文字数 k = Len(a) End If For j = 1 To k '1文字づつ比較して違う場合は検査結果+1 If Mid(a, j, 1) <> Mid(b, j, 1) Then count = count + 1 Next j '文字列の長さが違いを検査結果に足す count = count + ((Len(a) + Len(b)) - (k * 2)) End If '検査結果の記入 Range("C" & r).Cells = count Loop MsgBox "調べ終わりました!", vbOKOnly End Sub 6.タスクバーからエクセルのウィンドウを選択します。 7.配置したコマンドボタンをクリックして、周りに○が付いているならコントロールボックスツールバー内の三角定規のボタンをクリックします。 8.配置したコマンドボタンをクリックすると結果が表示されます。 もっと簡単な方法があるかもしれません。取りあえず急ぎで書きましたので・・・。

tsuka_kana
質問者

お礼

早々のご返答ありがとうございます。 やってみましたところ、下記のようなエラーがでてしまいました。 何か、間違ってしまったのでしょうか。。。 実行時エラー'1004' 'Range'メソッドは失敗しました:'_Worksheet'オブジェクト とでます。その後、下記内容の所が黄色になります。 a = Range("A" & i).Cells 'A列のデータを取得 何が悪いのかが分かりません。 お分かりになるようでしたら、確認頂けないでしょうか。。。 よろしくお願いいたします。

関連するQ&A