Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Pro : Excel 2007)
テキストボックスとワークシートの文字列比較
投稿日時: 17/11/26 17:37:51
投稿者: dirac

Excelワークシート上のデータをユーザーフォームで書き換えます.まず,セルの値をテキストボックスへ読み込んで,テキストボックスの値を編集し,それをセルへ書き込みます.
 
セルの最初の状態:Range("A1").Value="私は病気です."
 
セルからテキストボックスへの読み込み:txt1.Value=Range("A1").Value
 
テキストボックスの書き換え:txt1.Value="私は元気です."
 
テキストボックスからセルへの書き込み:
★If txt1.Value <> Range("A1").Value Then Range("A1").Value=txt1.Value
 
セルの最後の状態:Range("A1").Value="私は元気です."
 
ワークシート上の複数のセルを切り替えて,上記のようなコードを実行しています.★はRange("A2").Value=txt1.Valueでもよいのですが,変更があったテキストボックスのみセルを書き換えたいのでこうしています.
 
そこで質問です.★の文字列比較は演算子以外にstrComp(txt1.Value,Range("A2").Value,vbTextCompare)などでもよいのですが,多数のセルを切り替えてこれを行うとたまに同じはずなのに異なると判断する場合があります.デバッグで書き出しても違いがわかりません.セルの値をtxt1.Valueやtxt1.Textに書き込んだりすると,文字列が微妙に変わってしまうことがあるのでしょうか.それともワークシート上でセルの切り替えなどのイベントが発生するとテキストボックスやセルの値が微妙に変わることがあるのでしょうか.改行コードや見えない何かが・・・.
 
ご教示いただければ幸いです.

回答
投稿日時: 17/11/26 18:14:16
投稿者: simple

こんにちは。
同じ文字列をExcel側が気まぐれで一致せずと判定することは、まずありえません。
一番多いのは、文字列のうしろに半角spaceがついているケースでしょうね。
今度そうした場面に出くわしたら、Len関数で長さを比較してみて下さい。

回答
投稿日時: 17/11/26 18:39:29
投稿者: 半平太

>デバッグで書き出しても違いがわかりません
 
人間の目には同じに見えて、実際は違う例は幾らでもあります。
 
問題の2つのデータはそちらの手元にあるんですから、
一文字ずつ切出して、その文字コードを比較してみてください。
 
その違いがあぶり出されて初めて、その現象が本当に不可思議なことなのか、
当たり前の事なのか、検討に入れるんじゃないですか?

回答
投稿日時: 17/11/27 15:26:03
投稿者: WinArrow
投稿者のウェブサイトに移動

>デバッグで書き出しても
  
Debug.Print txt1.Text
のようにしていると思いますが、
  
Debug.Print txt1.Text & "ZZZ"
と無理やり"ZZZ"のような、特定の文字列を付加することで
見えないスペースが見えてきます。(ちょっととした工夫です)

回答
投稿日時: 17/11/27 19:29:08
投稿者: baoo

スペースもそうですが、VBAによってセルに文字列を入力する場合に
改行に違いが出ることもあるかと思います。
通常テキストファイルの改行コードはvbCrLfですが、
セル内でAlt+Enterにて改行する場合は改行コードはvbLfです。
これも見た目では区別つきません。
 
セル内のバイナリを表示するのも1つの手かと思います。
アドインにしてデバック用に使うとか。
フォームモジュールにテキストボックスを1つ配置

Option Explicit
Private Sub UserForm_Initialize()
    
    Dim byt16() As Byte
    Dim str16 As String
    Dim strLine As String
    Dim i As Long
    Dim j As Long
    
    For i = 0 To Len(ActiveCell.Value) / 16
        str16 = Mid(ActiveCell.Value, i * 16 + 1, 16)
        byt16 = StrConv(str16, vbFromUnicode)
        str16 = Replace(Replace(Replace(str16, vbCr, "."), vbLf, "."), vbTab, ".")
        For j = 0 To UBound(byt16)
            strLine = strLine & String(2 - Len(Hex(byt16(j))), "0") & Hex(byt16(j)) & " "
        Next j
        strLine = strLine & "  " & String(48 - 3 * Len(str16), " ") & str16 & vbCrLf
    Next i
    TextBox1.MultiLine = True
    TextBox1.Font.Name = "MS ゴシック"    '等幅フォント
    TextBox1.Value = strLine

End Sub

標準モジュールに
Private Sub Auto_Opne()
    
    Dim cb As CommandBar
    For Each cb In Application.CommandBars
        If cb.Name = "CellValue" Then
            cb.Delete
        End If
    Next
    
    Set cb = Application.CommandBars.Add("CellValue", msoBarTop, , True)
    With cb.Controls.Add(msoControlButton)
        .Caption = "CellValue"
        .OnAction = "ShowCellValue"
        .Style = msoButtonCaption
    End With
    cb.Visible = True
    
End Sub
Private Sub ShowCellValue()
    
    Dim fH As UserForm1
    Set fH = New UserForm1
    fH.Show vbModeless

End Sub

回答
投稿日時: 17/11/28 14:48:09
投稿者: mattuwan44

>多数のセルを切り替えてこれを行うとたまに同じはずなのに異なると判断する場合があります.
同じはずなら、異なると判断されても同じ内容の上書きだからなんの問題があるのですか?
 
数字やアルファベットの半角全角の違いもちょいちょいありますよね。
 
結局やりたいのは、アクティブなセルとユーザーフォームのリンク?
そして、なにが問題なのか、どこに不都合があるのか解らないです。

トピックに返信