仕事で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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
あるあるbotに投稿したけど採用されなかったあるある募集
あるあるbotに投稿したけど採用されなかったあるあるをこちらに投稿してください
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
VBA:同じ文字列データの比較がうまくいかない例
Excel(エクセル)
-
エクセルに詳しい方に教えて頂きたいです。 全く同じ文字に見えるのにEXACT関数を使って調べるとFA
Excel(エクセル)
-
エクセル 同じデータなのに違うという判定
Visual Basic(VBA)
-
-
4
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
5
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
6
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
7
エクセルVBAのIf,Then 構文でOr条件とAnd条件の結合方法?
Excel(エクセル)
-
8
別のシートから値を取得するとき
Visual Basic(VBA)
-
9
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
10
Excel VBA IF文がうまく動作しないわけがわかりません…
Visual Basic(VBA)
-
11
エクセルVBAで5行目からオートフィルタモードに設定したいたい
Excel(エクセル)
-
12
メッセージボックスのOKボタンをVBAでクリックさせたい
Visual Basic(VBA)
-
13
ワード上Shapeの位置情報を統一基準で取得したい
Visual Basic(VBA)
-
14
Excel VBAでほかのアプリケーションで使用中(ロック)のファイルを上書き保存したい
その他(プログラミング・Web制作)
-
15
vba 2つの条件が一致したらコピーして別シートに値のみ貼り付け
Visual Basic(VBA)
-
16
【EXCEL】【VBA】空欄は飛ばして処理する方法を教えて下さい。
Excel(エクセル)
-
17
アクセスのデータ型。数値型についてお聞きしたいのですが・・・
Access(アクセス)
-
18
DATE型変数を初期化する方法
Visual Basic(VBA)
-
19
VBAコード記述に際して、コード全体を自動的にインデント付ける方法
Access(アクセス)
-
20
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルについて
-
(マクロ)シートを保護してもマ...
-
ショートカットキー
-
Excelの警告について
-
【マクロ】シートを非表示した...
-
エクセルについて
-
if関数。半角文字や全角文字で...
-
エクセルの関数
-
Googleスプレッドシートで、名...
-
【Excel】 1つのセルの日にちを...
-
【Excel】効率的な関数式の組み...
-
Excelの更新日時が自動で更新さ...
-
エクセルの数式について教えて...
-
(マクロ)参照渡しにて、違う...
-
エクセルについての質問です。 ...
-
エクセルでファイルの最終更新...
-
エクセルについての質問です。 ...
-
Excelでの勤怠表の関数を教えて...
-
考えた式の戻り値が期待通りに...
-
エクセルを使ってQRコードを作...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelの警告について
-
エクセルデーターから必要な項...
-
エクセルでファイルの最終更新...
-
複数のテキストファイルをexcel...
-
Excelの複数条件の関数
-
【マクロ】ファイル名の一括変...
-
EXCELの散布図で日付が1900年に...
-
マクロの処理が遅くなった
-
Excelの時刻の不思議
-
エクセルでの2項目比較および...
-
Excelマクロで空白セルを詰めて...
-
エクセルの数式バーのフォント...
-
ExcelでASCを使って全角を半角...
-
エクセルで80万行、50列位のデ...
-
今まで文字化けなく開けていたc...
-
エクセルのことで教えてくださ...
-
エクセルVBA 月の中で、月~土...
-
Excelでの表の作り方
-
Excel セルにおけるフォント設...
-
エクセルの質問です。 F列からL...
おすすめ情報
皆さまご回答ありがとうございました。
こんなに多くの方にお答えしていただけるとは思っていなかったもので、こちらでお礼をさせていただきます。
ありがとうございます。
少し補足なのですが、テキストファイルを開くと、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様にさせていただければと思います。
エラーの見つけ方など、わからなかったことも多く大変勉強になりました。
貴重なお時間を割いて対応いただき本当にありがとうございました。
こちらのようなサイトを初めて使わせていただきましたが利用して良かったなと思いました。
皆様本当にありがとうございました。