
仕事でVBAをやっているのですが、壁にぶち当たってしまい、詳しいかたがいらっしゃいましたらアドバイスいただけたらと思い、初めてこちらを利用させていただきました。
とあるテキストファイルをエクセルで開き、A1セルにH1という文字列が入っていたとします。
A2セルには同じくH1とキーボードで入力します。
これをifでA1セルとA2セルが同じだったらというマクロを組んでもfalseになってしまいます。
ちなみに、どちらとも半角で、セルの書式設定は標準です。
一つ引っかかるのがLENB関数で調べたところA1セルは6バイトなのに対し、A2セルは4バイトだったことと
A1セルをコピーしてVBAのページに張り付けると" H1"となってしまうところがなにか原因なのかなと思いました。
なかなかうまく説明もできていないと思いますが、お助けいただけるかたがおりましたらよろしくお願いいたします。
No.14ベストアンサー
- 回答日時:
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関数で除去が可能です。
すみません
前回教えていただいたコードを試した結果を補足のほうに載せたつもりでしたが、忘れてました。
大変失礼をいたしました。
結果は
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となってしまいました。
No.15
- 回答日時:
No4です
>=CODE(MID($A$1,COLUMN(A1),1))のコードですが、
>9 72 49という結果が出ました。
そのまま順に、TAB、H、1 に相当します。
TABはタブキーのコードですので、目視できる文字形状にはなりません。
>よく出てきた9というのが原因を表す数字なのかなと思います。
それっぽいですが、確実かどうかは不明です。
はっきりとはしませんが、勝手に推測すると、もとの「テキストデータ」というのが、実は、「タブ区切りのデータ」なのではないのでしょうか?
それがはっきりしていれば、読込む際にタブ区切りで読込めば済むことになりますし、その方が正しいデータの扱い方とも言えるでしょう。
(後から、TABコードだけ取り除いても結果は同じにはなるでしょうけれど…)
極端に言えば、CSVデータ(カンマ区切りのデータ)をそのまま読込んでしまい、(カンマが残っているために)、「比較結果がfalseになってしまう」と言っているのと同様の可能性が高そうです。
(カンマの場合は目視できるので、すぐに気が付くでしょうけれど…)
>とあるテキストファイルをエクセルで開き~
どうやって読込んでいるのか不明ですが、通常の「開く」コマンドで開いているのであれば、読込む際に「タブ区切りのデータ」として設定できるはずと思います。
そのうえで読込めば自動的に「タブ区切り」と見做して処理してくれるので、読込んだデータにタブや改行が残ることはないはずです。
VBAから読込んでいる場合もほぼ同様にできるはずですが、一旦、テキストとして読込んで処理したりする場合には、改行で行を分け、タブでセル(=列)を分けるようにすれば同様の結果が得られるはずです。
わかりやすい説明をありがとうございます。
不明だったエラーを消すことにばかり集中していましたけど、ファイルを開くときに開き方を変えればよさそうですね。
No.12
- 回答日時:
このおじさんの話を解説すると、以下の作業をお願いしています。
・F1(セルはどこでも良い)に「=ASC(A1)=ASC(A2)」をコピペしてください。
・F2(セルはどこでも良い)に「=A1=A2」をコピペしてください。
結果としては、おそらくどちらのセルにも「FALSE」が表示されます。
また、私からのお願いですが、どうせならF3(セルはどこでも良い)に「=CODE(A2)」をコピペしてもらえませんか?
これは先頭文字の文字コードを返却する関数です。
H1の手前にある見えない文字の文字コードを調べることができます。
文字コードがわかれば、文字コードを指定して削除する、無視する等の手段を取ることもできます。
すみません。
ご親切に教えていただき感謝してます。
明日また出社しましたら試して結果をご報告したいなと思っております。
本当にありがとうございます。
No.10
- 回答日時:
貴方の質問文中の
》 A1セルにH1という文字列が入っていたとします。
》 A2セルには同じくH1とキーボードで入力します
に対して、私が[No.6]で“初心者にも至極単純な確認”をお願いしたことに対し、お約束の「試してご報告させていただければと思います」の結果はどうでしたか?
「かなか攻略できず」は他の方への言い訳として適用できても、私には的外しかと。
すみません。
仕事の合間を縫ってやっているので、返信が前後してしまい大変失礼をいたしました。
すみません、知識不足でよく分からなかったのですがセルに=ASC(A1)=ASC(A2)と入力すればよろしいのでしょうか?
=ASC(A1)と入力したところで、#NAME?となってしまうのですが…。
やり方が間違っていたらすみません。
No.9
- 回答日時:
No.2です。
スペースを削除しても消えないということですので、その空欄にはおそらくAsciiコードの0~1Fのどれかが入っているかと思います。
https://www.k-cube.co.jp/wakaba/server/ascii_cod …
で、毎回同じ文字が入るのであれば固定で対応できるのですが、何が入るか原因もわからないようですので、英数字の0-9a-zA-Z以外を削除してはいかがでしょうか。
これはパターンマッチと置き換えを組み合わせることで実施できます
ご回答ありがとうございます。
やはり見えない何かが隠れているということなのですね。
知識不足ですみません。
また自分で頑張ってみます。
ありがとうございました
No.8
- 回答日時:
>一つ引っかかるのが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ですから、半角という見方をします。
よかったら試してみてください。
ご回答ありがとうございます。
補足の方に書かせていただいたのですが、試した結果違いがでました。
これを参考にもう少し悩んでみます。
No.4
- 回答日時:
こんにちは
>ちなみに、どちらとも半角で、セルの書式設定は標準です。
それが確かであるならば、「H1」の文字数は2文字になるはずです。
>一つ引っかかるのがLENB関数で調べたところA1セルは6バイトなのに対し、
>A2セルは4バイトだったことと
この時点で、文字が「全角」であることなどが疑わしいですし、さらに前後に見えない文字コードが付帯していることも想像されます。(単なるスペースかも知れませんが)
例えば、A1セルに対象文字があるとして、B1セルに
=CODE(MID($A$1,COLUMN(A1),1))
の式を入れて、右方向にフィルコピーすれば、A1セルの文字列の1文字づつの文字コードが表示されます。
これを見れば、実際にどのような文字から構成されているかを調べることができるので、はっきりするのではないかと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルの書式設定の表示形式で設定した文字を文字列としてコピーしたい 1 2022/12/21 10:41
- Excel(エクセル) 【再度】Excelの関数について教えてください。 4 2023/07/28 13:06
- Excel(エクセル) Excelの関数について教えてください。 5 2023/07/28 11:27
- Excel(エクセル) 関数EXACT(文字列,文字列)とexcelVBA 3 2022/04/14 15:07
- Excel(エクセル) エクセルのマクロでコピー後の貼り付け先を毎回指定したところにしたい 5 2022/08/12 10:47
- Excel(エクセル) ユーザー定義について質問です。 2 2023/06/28 13:21
- Excel(エクセル) Excleマクロ セル値の代入と文字列の結合について 3 2022/10/05 16:47
- Excel(エクセル) Excelについて▶あるセルに文字を入力すると、別のセルに色がつく(条件付き書式) 1 2022/03/27 16:43
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 3 2023/02/28 01:13
- Visual Basic(VBA) VBAで自動集計(特定セルコピー月ごとに値貼り付け)したい。 6 2023/06/25 11:37
このQ&Aを見た人はこんなQ&Aも見ています
-
VBA:同じ文字列データの比較がうまくいかない例
Excel(エクセル)
-
エクセルに詳しい方に教えて頂きたいです。 全く同じ文字に見えるのにEXACT関数を使って調べるとFA
Excel(エクセル)
-
なぜこんな初歩的なVBAのIf文でエラーか発生して使えないのか、全く理解出来ません。誰か助けてくださ
Visual Basic(VBA)
-
-
4
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
5
実行時エラー 438になった時の対処法を教えて下さい。
Visual Basic(VBA)
-
6
日付の照合でFALSEになります。
Excel(エクセル)
-
7
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
8
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
9
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
10
初歩的な事だと思います。 Sub または Function が定義されていません。
Visual Basic(VBA)
-
11
エクセル 同じデータなのに違うという判定
Visual Basic(VBA)
-
12
お助けください!VBAのファイル名エラーについて
Visual Basic(VBA)
-
13
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
14
【ExcelVBA】5万行以上のデータ比較の効率的な処理方法について
Visual Basic(VBA)
-
15
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
16
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
17
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
18
Excel VBA IF文がうまく動作しないわけがわかりません…
Visual Basic(VBA)
-
19
VBA エンターキーでイベントに入りたい。
PowerPoint(パワーポイント)
-
20
VBAマクロ実行時エラーの修正について
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの関数について
-
エクセル GROUPBY関数について...
-
Excelで4択問題を作成したい
-
エクセル
-
エクセルについて
-
グループごとの個数をカウント...
-
エクセルシートの見出しの文字...
-
Amazonでマイクロソフトオフィ...
-
エクセルの複雑なシフト表から...
-
エクセルのリストについて
-
【マクロ】変数に入れるコード...
-
グループごとの人数のカウント
-
グループごとの人数のカウント
-
【マクロ】別ファイルへマクロ...
-
【マクロ】左のブックと右のブ...
-
【マクロ】【相談】Excelブック...
-
9月17日でサービス終了らし...
-
【マクロ】元データと同じお客...
-
エクセルの循環参照、?
-
【エクセル】期限アラートについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
9月17日でサービス終了らし...
-
エクセル
-
【マクロ】WEBシステムから保存...
-
エクセルの循環参照、?
-
エクセル ドロップダウンリスト...
-
エクセルのdatedif関数を使って...
-
特定のセルだけ結果がおかしい...
-
【マクロ】A列にある、日付(本...
-
【マクロ】EXCELで読込したCSV...
-
【マクロ】アクティブセルの時...
-
【エクセル】期限アラートについて
-
iPhoneのExcelアプリで、別のシ...
-
【関数】同じ関数なのに、エラ...
-
Excelの新しい空白のブックを開...
-
【マクロ】3行に上から下に並...
-
【マクロ】宣言は、何のために...
-
VBA チェックボックスをオーバ...
-
Excelについての質問です 並べ...
-
【マクロ】アクティブセルの2...
-
【関数】不規則な文章から●●-●●...
おすすめ情報
皆さまご回答ありがとうございました。
こんなに多くの方にお答えしていただけるとは思っていなかったもので、こちらでお礼をさせていただきます。
ありがとうございます。
少し補足なのですが、テキストファイルを開くと、H1=15というのが他のセルに開かれます。
そこから=の前までを取り出してH1のみをA1セルに入れてます。
A1セルに取り出した際に半角に変えたり、スペースを取り除いたりも試してみたので、そのせいでは無いと思います。
今日一日いろいろと調べながら試してみたのですがなかなか攻略できず、明日また皆さまからのご回答をヒントに試行錯誤してみようと思います。
もう一度実際のシートで詳しく説明させていただきます
画像のAのセルにテキストファイルのデータを開いて、それを=の前後で分割してBとDのセルに分けています。
例に出しましたB65のセルがH1となっていると思います。
たとえば空白のF65のセルにH1と入力してifで調べた時にB65とF65がtrueになればよいのですが。
F65のセルをコピーしてモジュールのほうに張り付けるとH1となるのに対し、
B65のセルのほうは" H1"となってしまっています。
B65のセルのHの前に見えないスペースがあるのだと思い、Hの前にカーソルを合わせて一度バックスペースを押したものをまたコピーしてモジュールのほうに張り付けたところH1となりtrueになりました。
ただし、trimやreplaceなどでスペースを消すことができなかったので、もしそのほかの方法で消す方法などがありましたら教えていただきたいです。
皆様ご回答ありがとうございます。
仕事の合間を縫って行っているため、レスが遅くなってしまったりとご迷惑をおかけして申し訳ございません。
お礼では書けなかった結果をこちらで書かせていただければと思います。
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というのが原因を表す数字なのかなと思います。
皆様、このたびは私の無理難題にお付き合いいただきありがとうございました。
WindFaller様に教えていただきましたclean関数で無事エラーを取り除くことができました。
また、fujillin様より教えていただきました、ファイルの開き方を変えるというのも利用してみようと思いました。
なにより、エラーを見つけ出そうとしていただけました皆様には大変感謝をしております。
皆様ベストアンサーにしたいくらい選べないのですが、今回はclean関数を教えていただきましたWindFaller様にさせていただければと思います。
エラーの見つけ方など、わからなかったことも多く大変勉強になりました。
貴重なお時間を割いて対応いただき本当にありがとうございました。
こちらのようなサイトを初めて使わせていただきましたが利用して良かったなと思いました。
皆様本当にありがとうございました。