お世話になります。

ExcelのVBAでテキストにタグをつけてxml形式で書き出すようにしたのですが、xmlの始めの文章で

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

で文字コード?を指定しているために書き出されたxmlをドリームウェーバーで開くと平仮名などの中身の文字が化けます。
MacのOSXを使っているためなのか、ADODBが使えないようです。


参考までにこんなプログラムです↓

Sub kaki_TextFile2()

Const cnsFILENAME = "a.xml"
Dim intFF As Integer ' FreeFile値
Dim strREC As String ' 書き出すレコード内容
Dim GYO As Long ' 収容するセルの行
Dim GYOMAX As Long ' データが収容された最終行

Worksheets("最終データ").Activate

' 最終行の取得
GYOMAX = Range("A65536").End(xlUp).Row
' FreeFile値の取得(以降この値で入出力する)
intFF = FreeFile
' 指定ファイルをOPEN(出力モード)
Open ThisWorkbook.Path & cnsFILENAME For Output As #intFF
' 2行目から開始
GYO = 2
' 最終行まで繰り返す
Do Until GYO > GYOMAX
' A列内容をレコードにセット(先頭は2行目)
strREC = Cells(GYO, 1).Value
' レコードを出力
Print #intFF, strREC
' 行を加算
GYO = GYO + 1
Loop
' 指定ファイルをCLOSE
Close #intFF
End Sub

といってもこちらから抜粋させていただいただけなのですが…

http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub0 …

VBもxmlも初心者同然なので、、、すみませんがよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

Windowsの場合、Print文で出力される文字コードはCP932=Shift_JISになる


のですが、Macの場合もShift_JISになるのですかね?
(日本語をPrint文で出力して、バイナリエディタで文字コードを調べれば
確認できるはず)

いっそのこと、String変数にはUnicodeで持っている(※)わけなので、
BinaryモードでUnicodeをはけば確実ではないでしょうか?

※ MsgBox AscW("あ") → 12354 → &H3042 で確認できるはず
(Shift_JISの"あ"は &H82a0となる)

# 最悪、encoding=UTF-8でもUnicodeエスケープすればできるかも。
# <?xml version="1.0" encoding="utf-8"?>
# <a>&#x3042;</a>
# ってのは 3042 は "あ" のUnicodeだが、ちゃんと表示できる。


もしくは、MacのExcelのバージョンが良くわからないのでできるかわかりませんが、
出力するものをすべてSheetに吐き出し、Unicodeのテキストファイルとして出力するとか。
(たぶんこれができれば一番楽)
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
本当に申し訳ないのですが、もう少しわかりやすく説明していただいてもよろしいでしょうか?
MsgBox AscW("あ")をイミディエイトで実行すると12354という結果が表示されたのですが
それをバイナリエディタに通せばいいのでしょうか?

最後の#最悪~~というところは全然理解ができなくて…すいません;;

ちなみにExcelは
Excel2004 for mac、
Microsoft visual basic 
共にバージョン11.0です。

お礼日時:2009/05/28 11:16

この検証用にちょうどよいMAC用バイナリエディタを見つけました。


「HexEditor」は文字のエンコーディングを指定して、表示させることができるそうです。
http://park.zero.ad.jp/pautha/hexeditor.html

MACには Microsoft XML V.xx みたいなdllは無いですよね?
    • good
    • 0

>Print #intFF, strREC ' レコードを出力


で出力したらMacでは文字コードがどうなるか確認してもらいたいわけです。

単純な文字列を吐き出し、出来上がったテキストファイルをバイナリエディタで
みたとき、どうなっているか
ということです。
    • good
    • 0

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>で、


そのXMLで使用される文字コードはUTF-8だと宣言しています。
これをもってXMLの文字コードを判定しているソフトもあれば、そうでない
ソフトもあります。
WindowsのEXCELで使われている文字コードはShift-JISです。
Print文は文字コードの変換をしないと思うのですが、
だから抜本的におかしいです。
そのXMLをどう使うのかわかりませんが、
<?xml version="1.0" encoding="Shift-JIS" standalone="yes"?>
と換えるのはだめなんですか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
でき上がったxmlを利用するときに、文字コードはUTF-8でないといけないそうです。
なので、その方法は使えそうになさそうです。
わざわざありがとうございます。

お礼日時:2009/05/28 10:57

>書き出されたxmlを全部コピーして上記が既に入力されているxmlファイルにペースト



という状態であれば、
Open ThisWorkbook.Path & cnsFILENAME For Output As #intFF
これを書き換えたいファイル名に変更してあげれば動作するのでは?

Dim Fname As String

Fname = Application.GetOpenFilename("XMLファイル,*.xml")
If Fname = "False" Then Exit Sub

上記を最初に行って書き換えたいXMLファイルを取得して、
Open Fname For Output As #intFF

とすればうまくいきそうな感じに受け取れるのですが。
    • good
    • 0
この回答へのお礼

ありがとうございます。
やってみたのですがうまく動作しませんでした( Application...でエラーがでます)
私のやり方が悪いのかもしれませんのでこんな感じにしたのですが↓

'Sub kaki_TextFile2()

Const cnsFILENAME = "a.xml"
Dim intFF As Integer ' FreeFile値
Dim strREC As String ' 書き出すレコード内容
Dim GYO As Long ' 収容するセルの行
Dim GYOMAX As Long ' データが収容された最終行
Dim Fname As String

Worksheets("最終データ").Activate ' シートの指定


Fname = Application.GetOpenFilename("XMLファイル,panaa.xml")
If Fname = "False" Then Exit Sub

GYOMAX = Range("A65536").End(xlUp).Row ' 最終行の取得
intFF = FreeFile ' FreeFile値の取得(以降この値で入出力する)

Open Fname For Output As #intFF ' 指定ファイルを開く


GYO = 2 ' 2行目から開始

Do Until GYO > GYOMAX ' 最終行まで繰り返す
strREC = Cells(GYO, 1).Value ' A列内容をレコードにセット(先頭は2行目)
Print #intFF, strREC ' レコードを出力
GYO = GYO + 1 ' 行を加算
Loop
Close #intFF
' 指定ファイルをとじる



関係ないのかもしれませんが、最初に書き込んだものを実行するとファイル名がフォルダ名を参照して一つ前の階層に保存されます。
ex)
デスクトップ/p(フォルダ)/Excelファイル

デスクトップ/pa.xml

お礼日時:2009/05/28 10:54

とりあえず普通のエディタで文字化けしないものを作りましょう。


xml 文字化けなどでググリましょう。

で、化けないようなxmlファイルが作れたら、
そのフォーマットにしたがって自動化してください。

一気にやるのは無茶です。一つ一つ課題をクリアしましょう
    • good
    • 0
この回答へのお礼

早いお返事ありがとうございます。
説明不足で申し訳なかったのですがExcelのシート上で

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

の文字列をいれずに書き出しするとxmlファイルは文字化けしないのです。
対策として…

xml上で文字コードを指定する文(上記)を入力しない状態で書き出す→書き出されたxmlを全部コピーして上記が既に入力されているxmlファイルにペースト

という手段をとっているのですが、なんとか自動化にする手段を探しています…
やはり無理なのでしょうか?

お礼日時:2009/05/26 16:37

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q文字化けメールの修復方法は?

文字化けメールが届いてしまいました。
エンコードの問題ではないようです。修復する方法はありますか?

Aベストアンサー

以下のHPで、もしかしたら読めるかもしれません。

参考URL:http://www.kanzaki.com/docs/jis-recover.html

QDim x As Integer = 0

いつもお世話になっております。

只今、本に記載してあるソースコードを手入力しています。
標記のように入力したら、『コンパイルエラー 修正候補:ステートメントの最後』というエラーが出ました。

(1)このエラーは無視してもよいのでしょうか?
(2)そもそも、変数の宣言文の後ろに=0をつけている意味がわかりません。当方VB初心者です。

よろしくお願いいたします。

Aベストアンサー

この点は(変数の宣言と初期化は)言語による、と考えるべきです。
この質問は何の質問か。
VB系統らしいことは判るが
VB以外のBASIC
VB6
VBA
VB.NET系統
のどれか質問に書くべき。質問者は経験が無くて、視野がそこまで行かないのかも知れないが。
ーーー
VBAでは(多分VBでも同じ。テスト環境がないので)
Sub test01()
Dim x As Integer
x = 0
MsgBox x
End Sub
はOK
ーー
Sub test01()
Dim x As Integer =0
MsgBox x
はDim x As Integer =0
と入力した段階でエラー。
http://www.bunsugi.ed.jp/vba4graduate/vba_hensuusyokika.htm
ーーー
定数のConstであればこういう書き方はOK
Sub test01()
Const x As Integer = 0
MsgBox x
End Sub
ーーー
VB.NETでは、OK
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
Dim x As Integer = 10
MsgBox(x)
End Sub
ーー
Javaでは可能であるようです
http://msugai.fc2web.com/java/var2.html
ーーーーー
>ろに=0をつけている意味がわかりません
宣言と同時に値を与える=初期化する

この点は(変数の宣言と初期化は)言語による、と考えるべきです。
この質問は何の質問か。
VB系統らしいことは判るが
VB以外のBASIC
VB6
VBA
VB.NET系統
のどれか質問に書くべき。質問者は経験が無くて、視野がそこまで行かないのかも知れないが。
ーーー
VBAでは(多分VBでも同じ。テスト環境がないので)
Sub test01()
Dim x As Integer
x = 0
MsgBox x
End Sub
はOK
ーー
Sub test01()
Dim x As Integer =0
MsgBox x
はDim x As Integer =0
と入力した段階でエラー。
http://www.bunsug...続きを読む

Qメールが全部文字化け!どうすれば修復できますか?

outlookexpress6を使用しています。

ある日突然受信トレイにあるメール内容がすべて文字化けされてしまいました。
どうしたらいいのでしょう・・

元にもどるのでしょうか。。。

エンコード設定でunicode utf8にしたら、自分のメールから自分のメールに送ったらうまくおくれたのですが、外部からおくられてくるメールはいまだに文字化けのままです。。。
受信トレイにたまったメールもすべて文字化けのままなので修復したいです。

お詳しい方どうぞアドバイスよろしくお願いします!

Aベストアンサー

次の操作を試してみてください。

1.[ツール]→[オプション]を実行
2.[読み取り]タブを選択
  2.1.[エンコード]→“日本語(自動選択)”
  2.2.[既定に設定]をクリック ← これ重要!
  2.3.[OK]をクリック

Qマクロで100マス計算! Dim i,j As Integer For i = 2 ToRang

マクロで100マス計算!

Dim i,j As Integer

For i = 2 ToRange(”A1”).End(xlDown).Row
For j=2 To Range(”B1”).End(xlToRight).Column

Cells(i,j).Value = Cells(i,1).Value * Cells(1,j).Value
Next j
Next i
Endsub

上記のように記述しましたが、
iの最終行が2となってしまっていますがなぜこのコードが間違っているのか分からないです。。どなたか教えていただけたら嬉しいです!

Aベストアンサー

確認してはいませんが…


>改行、スペースは実際にはきちんととっていますので気にしないでください
とのことなので、違っているのかもしれませんが、

>For i = 2 ToRange(”A1”).End(xlDown).Row
         ↓
 For i = 2 To Range(”A1”).End(xlDown).Row
で、うまくいきませんか?
100マス(10×10)と最初から決まっているので、範囲は 2 To 11 でも良いように思いますが…

改行、スペースなどが正しくなっているなら、Range(”A1”).End(xlDown).Rowの値が2以下になっている可能性が考えられます。(ということは、A1が空白セル、または、A3が空白セルなどなど・・)
A1が空白セルの場合は、
 For i = 2 To Range(”A2”).End(xlDown).Row
とするか、
 For i = 2 To 11
などとすることで、動作するのではないかと推測します。

Q 文字化けの修復方法

windouws 98 NEC ノートパソコンで
文字化けしてしまい一般的な修復方法の
セーフモードにして再起動するとよく直っていたんですが今回は直りませんでした。
セーフモード中は直って普通に見えるのですが
再起動で立ち上げるとま文字化けしてしまいます
何か良い改善方法をおしえてください。
お願いします。

Aベストアンサー

参考URLをご覧のうえ、対処してください。

参考URL:http://homepage2.nifty.com/winfaq/fontstrouble.html

QMicroSoft BasicのDim文とVisualBasicのDim文の違い

私が20年前にMicroSoft Basicを使っていたときは、DIM文はDIMENSIONの略で配列型変数の宣言に使っていました。

最近VisualBasicの勉強を始めたのですが、変数の宣言はすべてDim文になっており、昔のMS BasicのDim文と意味合いが変わっているのに驚いています。

ここで質問させてください。
・なぜ配列を意味するDimension文が変数の宣言なのか?
・どのバージョンのBasicからDim文の意味が変わったのか?

私が使用していたのはNEC N-Basic,N-88Basic,N-98Basicです。

Aベストアンサー

VISUAL BASIC のDimは ディメンジョンの略です。
私の経験ではVB2.0時代からありました。

配列0を考えた場合変数とおなじであるからだとおもいます

Q文字化けしたワードファイルの修復方法を教えてください

word2003で作成し、保存していた文書を、同じパソコンのword2003で開いたら文字化けしていました。
以前見たときは正常に表示されていて、その後何か操作をした覚えもありません。
文字化けした部分は□が並んだようになっています。

教えてgooの過去の質問や、他のサイトをみて解決方法を調べ、フォントを変える、htmlファイルやrtfファイルで保存しなおす、ワードパッとにコピーする、等色々試して見ましたが直りません。

大切な文書でしたので、修復方法をお教えください。
お願いします。

Aベストアンサー

☐の部分は、文字(文字コード)であったことは確実ですか。
例えば1例でも、(元は)どんな内容か思い出せますか。
正しく表示されていたころは、質問者はそれを見た事を覚えていますか。
ところどころ、少ない部分だけですか。
その後何か特別なことをした、ことは思い出せませんか。
ーー
「文字化け」というのは文字コード(体系)の問題だと思います。間接的にFontなどと関連しますが直接的ではないと思う。
もがいている方向性が疑問に思ったもので。
http://www.asahi-net.or.jp/~ax2s-kmtn/character.html
本質問の解決に直接役に立たないと思うが、参考までに見て置いてください。
何か思い当たる点は無いですか。
上記WEBにもある、機種依存文字など関係ないですか。
文書やファイル作成時に使われた文字コード体系がファイルに記録されるとはっきりするが、そういうOSの仕組みではないようなので難しい。

QRst.FindFirst "名称コード" & "=" & "'101'"

タイトルのコードでは問題ないのですが、 101 を文字変数にすると「抽出条件でデータ型が一致していません」のエラーになります。この場合シングルクオーテーションはどういう意味なのでしょうか。
どうすれば良いのでしょうか。

dim Vcode as string
Vcode = "101"
Rst.FindFirst "名称コード" & "=" & Vcode

Aベストアンサー

FindFirst や、フォームの Filter プロパティで設定する場合は、SQL文のWHERE句の
内容を設定する必要があります。

フィールド名がテキスト型の場合は、

SELECT * FROM テーブル名 WHERE フィールド名 = "xxx"

のようになります。
で、FindFirst メソッドなんかで使う場合は、

rst.FindFirst フィールド名 = "xxx"

としたいところですが、条件の部分は文字列にしないといけません。
で、

rst.FindFirst "フィールド名 = "xxx""

こうすると、

フィールド名 =

で、切れてしまいます。
そこで、

rst.FindFirst "フィールド名 = 'xxx'"

このようにすればOKです。
次のステップとして、xxx の部分を変数を使ってやりたい場合。
単純に変数名に置き換えると、

rst.FindFirst "フィールド名 = '変数名'"

ですが、変数を、"" の中に記述すると、文字列として扱われますので、"" の外に
出してやる必要があります。
その場合、文字列と変数をつなぐためには、& を使います。

rst.FindFirst "フィールド名 = '" & 変数名 & "'"

で、このようになります。

FindFirst や、フォームの Filter プロパティで設定する場合は、SQL文のWHERE句の
内容を設定する必要があります。

フィールド名がテキスト型の場合は、

SELECT * FROM テーブル名 WHERE フィールド名 = "xxx"

のようになります。
で、FindFirst メソッドなんかで使う場合は、

rst.FindFirst フィールド名 = "xxx"

としたいところですが、条件の部分は文字列にしないといけません。
で、

rst.FindFirst "フィールド名 = "xxx""

こうすると、

フィールド名 =

で、切れてしまいます...続きを読む

Q文字化けしたフランス語のメールを修復するには?

フランス語のメールが文字化けしてしまい、
うまく読めなくなってしまいました。

すでに難しい漢字などが紛れてしまった文章を
修復できるようなフリーソフトなどはございませんか?
またはPCの簡単な設定で修復する方法がありますか?
こちら、windows vistaです。
初心者でもわかりやすいものがあれば教えてください。

よろしくお願いいたします。

Aベストアンサー

duosonic です。お疲れ様でした。
ユードラって亜流です、ハッキリ言って。もともとマック用にデザインされた?らしいので、Windowsとは相性悪いのもうなづけます。そもそもライブドアホリエモンが関わっているというだけで、僕の中ではボツです (^^;)

Vistaには Windows Mailが入っていますよね。それで再生できませんかね?

>>あいさつ程度のフランス語しかできませんので、差出人のフランス人にもう一度送って~なんていうことを言えるかどうか・・・(;_;)
>あそうなんですか。何と申し上げて良いのやら 、、、(-_-;)

通じるか否か分からないフランス語で書くよりも、英語で出しちゃうのは手ですよ。欧州人は大抵英語大丈夫ですから。(僕の回答歴?ご覧頂くとお分かりかと思いますが、)英語ならいくらでもお教えいたしますので、ご安心下さい。或いは、フランス語を書けるだけ書いて、外国語?カテで内容が大丈夫か聞いてくるのも手です。


ご参考までに。

QVB6変数の宣言dim j,k,p,m,n as Integerは良くない?

お世話になります。

VB暦1年です。

汎用の変数宣言でタイトルのように
dim j,k,p,m,n as Integer
dim ssa,ssb as String

など、カンマ区切りで変数宣言を使っていたのですが
最近、知人にasの手前の変数は型どおり宣言されるが
その手前の変数はVariant型で宣言されてしまうと指摘されました。

指摘されるまで気にはしていませんでしたが
ウォッチで確認すると変数に代入されるまでは
型がVariant/Emptyとなってます。

以後、気をつければいいのですが
過去にコーディングしたプログラムにも多少、使用していて客先に納品してしまっているものもあります。
後々、問題になるのかな?

Aベストアンサー

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというようなバグの原因になりやすいので、型を明示できるような状況で敢えてVariant型を使うべきではないです。

しかし、すでに納品してしまったコードについては、問題はメモリを余計に使ってしまうことくらいではないでしょうか?
他の人が気づかなかったことから考えるに、多分狭いスコープで使っていますよね? 比較対象や代入するべき型を誤るというようなロジックの誤りがない限り、少なくとも動作上の問題は発生しないと思います。ただ、直せる機会があるのであれば、直した方がいいとは思いますが。

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというよう...続きを読む


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

人気Q&Aランキング