人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

EXCELにWEBページから貼り付けて利用しています。

貼り付けを行うとHTML上の「&nbsp」まで張り付いており、
それをEXCELのVBA上で削除したいと思いいろいろ思考錯誤しておりますがうまくいきません。

ASC関数で調べると63を返すので、Replace関数でchr(63)を置き換えようとしますが、
一致しないらしく、まったく置換えができない状況です。
※同構文でたとえば「a」を削除などは問題なくできていますので、構文の問題ではないと考えています。
※なお、MID関数で一文字ずつ文字コード比較を行うと63でヒットしますのでわけがわかりません。。。

ネットでいろいろ検索しましたが、どれも解決にはいたっていないらしく途方にくれております。

EXCELのVBAに詳しい方がいれば解決方法をお教えください。

●質問者: curd
●カテゴリ:コンピュータ インターネット
✍キーワード:ASC Excel HTML MID VBA
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● captim
●27ポイント

これでどうでしょうか?

Sub Macro1()

'

' &nbspを空白に変換する

'

'

Cells.Replace What:="&nbsp", Replacement:="", LookAt:=xlPart, _

SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _

ReplaceFormat:=False

End Sub

◎質問者からの返答

残念ながらだめでした。

"&nbsp"としてしまうと、文字列比較になりませんか?


2 ● りくっち
●27ポイント

いくつか確認を交えながら。

貼り付けを行うとHTML上の「&nbsp」まで張り付いており

具体的にどんなHTMLページをどんな方法でコピー貼り付けされていますか?

実のところ&nbspを削除できなくなるような状況が再現できなくて首を傾げています。

例えば、HTMLページを書式もそのままコピペしているということなら、&nbspを削除するとデータが変わってしまいます。

テキストだけが必要であれば、貼り付ける際に「形式を選択して貼り付け」でテキストを選択すれば&nbspは含まれませんし、

テーブルは直接外部データとしてインポートすることもできます。

ソースが必要であれば、ブラウザ側でソース表示してからコピペでき、この場合は簡単に置換できます。

こういうったことで状況が再現できないのです…。


そこで気になるのが

ASC関数で調べると63を返す

です。

VBのASC関数はその名の通りASCIIの10進文字コードを返すわけですが、

その場合、63は「?」を示します。

ASCII文字コード : IT用語辞典

アンパサンド(記号で書くとはてなは化けるの…)なら38、

&nbspの元々の意味である空白文字でも32(space)を算出しないとおかしいのです。

…ということは、貼り付けているHTMLソースがExcelに貼った時点で文字化けしているのではないか、という仮説がたつかと。

そのため文字コード自体が合わないので、検索も正しくできないのではないかと考えるわけです。


単純に「&nbsp」が含まれているテキストデータであれば、一般機能の置換処理をマクロ記録したものでも十分機能します。

以上から、まず一度貼り付けもとのHTMLソースを確認されることをご提案したいと思います。


以上ご参考まで。

◎質問者からの返答

ご回答ありがとうございます。

>具体的にどんなHTMLページをどんな方法でコピー貼り付けされていますか?

WEBのページの該当箇所(表部分)を選択し、コピー(CTRL+C)を行い、エクセルを立ち上げ、ペースト(CTRL+V)という操作になります。

なお、上記の方法で形式を指定して貼り付けを行った場合も「 」については、おそらくご指摘のとおり文字化けをして張り付いているのだと思います。

※EXCEL上では空白(半角スペース)に見えるが、実際は文字コード63を返す

上記の現象までは把握していますが、

問題はreplaseで置き換えたくても、CHR(63)でも、"?"でも置き換えができないため、

どうしたものかと悩んでいます。


3 ● ardarim
●26ポイント

Excelの不具合?だと思いますが、 の文字の扱いがおかしいです。


 は、Unicodeでは普通のスペース(U+0020)とは別の、U+00A0(10進数では160)が割り当てられています。(文字の名称としては、Non-break Space)

しかし、ExcelはHTMLからの変換の際に、ASCIIコードとして変換してしまっているようです。ASCIIコード(0x80?0xFFは拡張ASCII)では、0xA0は、「á」です。


ここでさらにおかしくしているのは、áが我々の使っているシフトJISのコードには存在しないため、Excelは、「á」に近い文字である「a」に勝手に変換して処理してしまいます。そのため、ASC()で文字コードを取得すると「a」の文字コード 0xA0(63)を返します。

一応回避策としては、ASCB()を使うと、63ではなく、160(0xA0)を取得できます。そのため、ASCB()で1文字ずつ操作して160の場合は と見なすことができそうです。Unicodeで切り出して(MID())、ASCIIコードを取得する(ASCB())という一見おかしな処理になるところがポイントです。


Excelが、0x100未満(0x00?0xFF)はASCIIと勝手に見なしてしまっておかしなことになっているのかもしれません。

◎質問者からの返答

ご回答ありがとうございます。

上記の内容でいくつかの疑問が解決しました。

実は、海外で同様の質問があがっており、その場合の解決策では「U+00A0(10進数では160)」で置き換えを行っており、

質問者もそれで問題が解決したとよろこんでおられました。

この方法を自分で試した際、ご指摘の通り、

文字コードを63で返されうまくいかなかった点が

自分の中でも「なぜ?」といつまでも結論が出ていない問題でした。

ご回答にあったEXCELのコード変換ロジックの不具合という説明を伺うと、

海外での回答内容が私の環境では日本語環境独自のEXCELの不具合により

対処できない状況であった点もわかりました。

お教えいただいた方法で無事処理を行うことができました。

ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ