- ベストアンサー
エクセルの文字数カウントに関して
エクセル初心者なのでお恥ずかしい質問かもしれませんが、ご協力よろしくお願いいたします。 A列 B列 C列 123 124 1 122 122 0 124 12 1 上記のようにA列・B列を比較して、違う文字の文字数をC列に 出したいのですが、どうもうまくいきません。 よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 はっきりとした法則性は見出せませんでしたが、今回は、見切ってしまいます。 それで、以下のような数式でできるよな気がします。ただし、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列のデータを取得
その他の回答 (4)
お示しのデータが 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)}
お礼
どうもありがとうございました。 おかげさまで、無事に解決する事ができました。
- hige_082
- ベストアンサー率50% (379/747)
一例です 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 参考になれば
お礼
ありがとうございました。 参考にさせて頂きます。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 ご質問を読む限りは、VBAでないと無理ではないかと思います。 きちんと確認してほしいことがあります。 >違う文字の文字数をC列に 例えば A B C 123 312 0 同じ 212 122 0 同じ 1111 312 3 A側からみれば、3 です。 そういう考え方でよいのでしょうか。
補足
こんにちは。 A列が基準になりますので、 >例えば > A B C >123 312 0 同じ この場合C列→3 >212 122 0 同じ この場合C列→2 >1111 312 3 A側からみれば、3 です。 になります。 よろしくお願いいたします。
- hosohoso13
- ベストアンサー率44% (138/313)
文字を比較する関数はありますが、何文字違うかを返す関数は無いと思いますので、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.配置したコマンドボタンをクリックすると結果が表示されます。 もっと簡単な方法があるかもしれません。取りあえず急ぎで書きましたので・・・。
お礼
早々のご返答ありがとうございます。 やってみましたところ、下記のようなエラーがでてしまいました。 何か、間違ってしまったのでしょうか。。。 実行時エラー'1004' 'Range'メソッドは失敗しました:'_Worksheet'オブジェクト とでます。その後、下記内容の所が黄色になります。 a = Range("A" & i).Cells 'A列のデータを取得 何が悪いのかが分かりません。 お分かりになるようでしたら、確認頂けないでしょうか。。。 よろしくお願いいたします。
お礼
どうもありがとうございました! うまくいきました!