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


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

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

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

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

回答の条件
  • 1人2回まで
  • 登録:2008/02/28 17:04:22
  • 終了:2008/03/06 17:05:02

回答(3件)

id:captim No.1

captim回答回数109ベストアンサー獲得回数62008/02/28 18:21:01

ポイント27pt

これでどうでしょうか?

Sub Macro1()

'

' &nbspを空白に変換する

'

'

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

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

ReplaceFormat:=False

End Sub

id:curd

残念ながらだめでした。

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

2008/02/28 18:40:17
id:rikuzai No.2

りくっち回答回数1366ベストアンサー獲得回数1412008/02/29 11:28:01

ポイント27pt

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

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

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

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

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

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

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

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

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


そこで気になるのが

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

です。

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

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

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

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

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

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

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


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

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


以上ご参考まで。

id:curd

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

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

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

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

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

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

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

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

2008/02/29 11:47:24
id:ardarim No.3

ardarim回答回数896ベストアンサー獲得回数1442008/02/29 22:48:29

ポイント26pt

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と勝手に見なしてしまっておかしなことになっているのかもしれません。

id:curd

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

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

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

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

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

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

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

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

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

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

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

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

2008/03/02 22:39:05
  • id:ardarim
    すみません。
    寝ぼけてたんだかなんだか、見直したらいろいろ間違ってました。
    もっともらしく書いたのに本当にすみません。

    63は、'a'ではなく'?'ですね。
    いずれにせよ、á('a'の上にダッシュがついた文字)はシフトJISコードではあらわせないので、'?'に変換されます。日本語環境独自の問題であることは間違いありません。

    なお、回答した方法よりスマートな方法が見つかりましたので追記しておきます。
    文字列関数のUnicodeバージョン(ChrではなくChrW)を使うとうまくいきました。
    たとえば、
    Replace(Cells(1, 1).Value, ChrW(160), " ")
    は期待通りの動作をします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません