dポイントプレゼントキャンペーン実施中!

仕事でVBAをやっているのですが、壁にぶち当たってしまい、詳しいかたがいらっしゃいましたらアドバイスいただけたらと思い、初めてこちらを利用させていただきました。

とあるテキストファイルをエクセルで開き、A1セルにH1という文字列が入っていたとします。
A2セルには同じくH1とキーボードで入力します。
これをifでA1セルとA2セルが同じだったらというマクロを組んでもfalseになってしまいます。

ちなみに、どちらとも半角で、セルの書式設定は標準です。

一つ引っかかるのがLENB関数で調べたところA1セルは6バイトなのに対し、A2セルは4バイトだったことと
A1セルをコピーしてVBAのページに張り付けると" H1"となってしまうところがなにか原因なのかなと思いました。

なかなかうまく説明もできていないと思いますが、お助けいただけるかたがおりましたらよろしくお願いいたします。

質問者からの補足コメント

  • 皆さまご回答ありがとうございました。
    こんなに多くの方にお答えしていただけるとは思っていなかったもので、こちらでお礼をさせていただきます。
    ありがとうございます。

    少し補足なのですが、テキストファイルを開くと、H1=15というのが他のセルに開かれます。
    そこから=の前までを取り出してH1のみをA1セルに入れてます。

    A1セルに取り出した際に半角に変えたり、スペースを取り除いたりも試してみたので、そのせいでは無いと思います。
    今日一日いろいろと調べながら試してみたのですがなかなか攻略できず、明日また皆さまからのご回答をヒントに試行錯誤してみようと思います。

      補足日時:2019/07/16 20:20
  • もう一度実際のシートで詳しく説明させていただきます
    画像のAのセルにテキストファイルのデータを開いて、それを=の前後で分割してBとDのセルに分けています。
    例に出しましたB65のセルがH1となっていると思います。
    たとえば空白のF65のセルにH1と入力してifで調べた時にB65とF65がtrueになればよいのですが。

    F65のセルをコピーしてモジュールのほうに張り付けるとH1となるのに対し、
    B65のセルのほうは" H1"となってしまっています。
    B65のセルのHの前に見えないスペースがあるのだと思い、Hの前にカーソルを合わせて一度バックスペースを押したものをまたコピーしてモジュールのほうに張り付けたところH1となりtrueになりました。
    ただし、trimやreplaceなどでスペースを消すことができなかったので、もしそのほかの方法で消す方法などがありましたら教えていただきたいです。

    「同じ文字列なのにfalseになってしまい」の補足画像2
      補足日時:2019/07/17 11:38
  • 皆様ご回答ありがとうございます。
    仕事の合間を縫って行っているため、レスが遅くなってしまったりとご迷惑をおかけして申し訳ございません。
    お礼では書けなかった結果をこちらで書かせていただければと思います。

    No4のfujillin様より教えていただいた=CODE(MID($A$1,COLUMN(A1),1))のコードですが、
    9 72 49という結果が出ました。

    No11のmike_g様より教えていただいた
    「=ASC(A1)=ASC(A2)」と「=A1=A2」はどちらもFALSEでした。

    No12の taunamlz様より教えていただいた「=CODE(A2)」の結果は9でした。

    みなさまから見えないエラーを調べる方法を教えていただいた結果よく出てきた9というのが原因を表す数字なのかなと思います。

      補足日時:2019/07/18 09:06
  • 皆様、このたびは私の無理難題にお付き合いいただきありがとうございました。
    WindFaller様に教えていただきましたclean関数で無事エラーを取り除くことができました。
    また、fujillin様より教えていただきました、ファイルの開き方を変えるというのも利用してみようと思いました。
    なにより、エラーを見つけ出そうとしていただけました皆様には大変感謝をしております。
    皆様ベストアンサーにしたいくらい選べないのですが、今回はclean関数を教えていただきましたWindFaller様にさせていただければと思います。
    エラーの見つけ方など、わからなかったことも多く大変勉強になりました。
    貴重なお時間を割いて対応いただき本当にありがとうございました。
    こちらのようなサイトを初めて使わせていただきましたが利用して良かったなと思いました。
    皆様本当にありがとうございました。

      補足日時:2019/07/18 10:13

A 回答 (13件中1~10件)

No.8 の回答者です。



>trimやreplaceなどでスペースを消すことができなかったので、もしそのほかの方法で消す方法などがありましたら教えていただきたいです。

どうやら、文字コードで解明するという案は採用されないようですね。
誰かがヒットするかもしれませんが、Replace や Trim でやっても原因になる部分を公開しなければ無理です。思い当たるものを全部羅列して除去するなんていうのは、面倒だからです。

それを、逆に英数だけ抜き出して、分離させるというのは、できなくはないけれども、アイデアと現実では違いがあります。

何が原因なのか、その文字コードを教えていただければ済む話なのです。
ただし、私は、CODE関数ではなく、UNICODE関数の方がよいと思います。
CODE関数では出てこないこともあります。出てきても、文字コードが「63」と出てくることがあります。これでは何か分かりません。UNICODE関数がなければ、NO.8 のコードを使ってくれればよいてす。nbsp に似たもの、emsp, ensp などがあります。
この他にも、まだいろいろとあるように思います。

B列の文字対象。右にドラッグ No.4 さんの数式を借用
=IFERROR(UNICODE(MID($B1,COLUMN(A1),1)),"")

エスケープシーケンスが原因の場合は、Clean関数で除去が可能です。
    • good
    • 0
この回答へのお礼

すみません
前回教えていただいたコードを試した結果を補足のほうに載せたつもりでしたが、忘れてました。
大変失礼をいたしました。
結果は
H1 0048 0031
H1 0009 0048 0031
となりました。
おそらく0009というのが原因ですよね。

また、教えていただいた=IFERROR(UNICODE(MID($B1,COLUMN(A1),1)),"")も試してみました。
やり方があっているかわかりませんが、A1セルにH1,B1セルに=IFERROR(UNICODE(MID($B1,COLUMN(A1),1)),"")を入力して、
右にフィルコピーしましたが0 0 0 0となってしまいました。

お礼日時:2019/07/18 08:46

No4です



>=CODE(MID($A$1,COLUMN(A1),1))のコードですが、
>9 72 49という結果が出ました。
そのまま順に、TAB、H、1 に相当します。
TABはタブキーのコードですので、目視できる文字形状にはなりません。

>よく出てきた9というのが原因を表す数字なのかなと思います。
それっぽいですが、確実かどうかは不明です。
はっきりとはしませんが、勝手に推測すると、もとの「テキストデータ」というのが、実は、「タブ区切りのデータ」なのではないのでしょうか?
それがはっきりしていれば、読込む際にタブ区切りで読込めば済むことになりますし、その方が正しいデータの扱い方とも言えるでしょう。
(後から、TABコードだけ取り除いても結果は同じにはなるでしょうけれど…)

極端に言えば、CSVデータ(カンマ区切りのデータ)をそのまま読込んでしまい、(カンマが残っているために)、「比較結果がfalseになってしまう」と言っているのと同様の可能性が高そうです。
(カンマの場合は目視できるので、すぐに気が付くでしょうけれど…)

>とあるテキストファイルをエクセルで開き~
どうやって読込んでいるのか不明ですが、通常の「開く」コマンドで開いているのであれば、読込む際に「タブ区切りのデータ」として設定できるはずと思います。
そのうえで読込めば自動的に「タブ区切り」と見做して処理してくれるので、読込んだデータにタブや改行が残ることはないはずです。
VBAから読込んでいる場合もほぼ同様にできるはずですが、一旦、テキストとして読込んで処理したりする場合には、改行で行を分け、タブでセル(=列)を分けるようにすれば同様の結果が得られるはずです。
    • good
    • 0
この回答へのお礼

わかりやすい説明をありがとうございます。
不明だったエラーを消すことにばかり集中していましたけど、ファイルを開くときに開き方を変えればよさそうですね。

お礼日時:2019/07/18 09:52

このおじさんの話を解説すると、以下の作業をお願いしています。


・F1(セルはどこでも良い)に「=ASC(A1)=ASC(A2)」をコピペしてください。
・F2(セルはどこでも良い)に「=A1=A2」をコピペしてください。

結果としては、おそらくどちらのセルにも「FALSE」が表示されます。

また、私からのお願いですが、どうせならF3(セルはどこでも良い)に「=CODE(A2)」をコピペしてもらえませんか?
これは先頭文字の文字コードを返却する関数です。
H1の手前にある見えない文字の文字コードを調べることができます。
文字コードがわかれば、文字コードを指定して削除する、無視する等の手段を取ることもできます。
    • good
    • 0
この回答へのお礼

すみません。
ご親切に教えていただき感謝してます。
明日また出社しましたら試して結果をご報告したいなと思っております。
本当にありがとうございます。

お礼日時:2019/07/17 20:19

貴方の質問文中の


》 A1セルにH1という文字列が入っていたとします。
》 A2セルには同じくH1とキーボードで入力します
に対して、私が[No.6]で“初心者にも至極単純な確認”をお願いしたことに対し、お約束の「試してご報告させていただければと思います」の結果はどうでしたか?
「かなか攻略できず」は他の方への言い訳として適用できても、私には的外しかと。
    • good
    • 0
この回答へのお礼

すみません。
仕事の合間を縫ってやっているので、返信が前後してしまい大変失礼をいたしました。

すみません、知識不足でよく分からなかったのですがセルに=ASC(A1)=ASC(A2)と入力すればよろしいのでしょうか?
=ASC(A1)と入力したところで、#NAME?となってしまうのですが…。
やり方が間違っていたらすみません。

お礼日時:2019/07/17 12:22

No.2です。



スペースを削除しても消えないということですので、その空欄にはおそらくAsciiコードの0~1Fのどれかが入っているかと思います。
https://www.k-cube.co.jp/wakaba/server/ascii_cod …

で、毎回同じ文字が入るのであれば固定で対応できるのですが、何が入るか原因もわからないようですので、英数字の0-9a-zA-Z以外を削除してはいかがでしょうか。
これはパターンマッチと置き換えを組み合わせることで実施できます
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
やはり見えない何かが隠れているということなのですね。
知識不足ですみません。
また自分で頑張ってみます。
ありがとうございました

お礼日時:2019/07/17 14:50

>一つ引っかかるのがLENB関数で調べたところA1セルは6バイトなのに対し、


>A2セルは4バイトだったことと
どちらもこちらの想定とは違いますから、状況が分かりません。文字2つの半角なら2バイトになるはずです。
全角2文字なら、4バイトです。ネットから取り出したというなら、1個のnbsp 付きで、+1
全角スペースなら、+2バイトになるという計算です。(nbsp -ノーブレイク・スペース)
(ただし、これは、ワークシート上でないと、LenBのバイト数は正しくでません。VBAでは、一旦、UnicodeからJISに戻さないとバイト数はでません。代わりに、以下にあるコードならわかります)

マクロでどう組んでいるのか見えません。元の文字列がどういう状態なのか。まず、等幅フォント(MS ゴシック等)で、目で比較してみてからの話になりそうな気がします。

もし余裕があるなら、以下のようなコードで調べます。
むろん、バイナリエディタを用いていも同じす。

もし、既知のことでしたら、読み飛ばしてください。(時々、分かりきったことに説明などいらないと、立腹する人がいるようです。)以下のように、視覚化していただければ、どなたでも了解できると思います。
(今、ログを見ましたら、すでに、No.4さんの解答と重複するようですが、nbsp の異種が、紛れ込んだ時に違いがでますが、CODE関数の代わりに、UNICODE関数を使えば、同じになります。)

'//みえない文字の視覚化
Sub TestBinaryOut()
 Dim c As Range
 Dim b() As Byte
 Dim i As Long, j As Long, k As Long
 k = 1
 For Each c In Range("A1:A2")
  b = c.Text
  For i = 0 To UBound(b) Step 2
   'C列からの書き出し
   Cells(k, "C").Offset(, j).Value = "'" & Right("0" & Hex(b(i + 1)), 2) & Right("0" & Hex(b(i)), 2)
   j = j + 1
  Next
  j = 0
  k = k + 1
 Next
End Sub
'//
上記のようなマクロで、バイナリで調べれば、どのように違っているか分かります。

出力例:A1:A2
文字列 長さ  右に文字コード一覧
H1   3    0048  0031  00A0
H1  6    FF28  FF11  3000

語尾の00A0 というのは、一般的な {nbsp} で、3000 は、全角スペースです。
0048で、00 |48 と上位桁と下位桁とを2分し、上位桁が、00、下位桁48で、上位桁00ですから、半角という見方をします。
よかったら試してみてください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
補足の方に書かせていただいたのですが、試した結果違いがでました。
これを参考にもう少し悩んでみます。

お礼日時:2019/07/17 12:34

A1の文字列を引用し、B1でも、どこでも好きな場所に


=TRIM(A1)
で見えないスペースを削除し、それを同位置にコピー&ペースト(文字列)でそいつをA2に持って来ても駄目でしょうか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
trimでもスペースを取ることができませんでした。

お礼日時:2019/07/17 12:28

式 =ASC(A1)=ASC(A2)



式 =A1=A2
の結果を教えてください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
明日また会社で試してご報告させていただければと思います。

お礼日時:2019/07/16 20:29

テキスト貼り付けしたものに改行がいませんか?A2をA1にコピペして見てみて。

    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
改行は見当たらなかったです。

お礼日時:2019/07/16 20:28

こんにちは



>ちなみに、どちらとも半角で、セルの書式設定は標準です。
それが確かであるならば、「H1」の文字数は2文字になるはずです。

>一つ引っかかるのがLENB関数で調べたところA1セルは6バイトなのに対し、
>A2セルは4バイトだったことと
この時点で、文字が「全角」であることなどが疑わしいですし、さらに前後に見えない文字コードが付帯していることも想像されます。(単なるスペースかも知れませんが)

例えば、A1セルに対象文字があるとして、B1セルに
 =CODE(MID($A$1,COLUMN(A1),1))
の式を入れて、右方向にフィルコピーすれば、A1セルの文字列の1文字づつの文字コードが表示されます。
これを見れば、実際にどのような文字から構成されているかを調べることができるので、はっきりするのではないかと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
こんなやり方があるのですね。
明日試してみたいと思います。

お礼日時:2019/07/16 20:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A