[[20200630224414]] 『2次元配列(環境依存文字) VBA』(パオパオ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『2次元配列(環境依存文字) VBA』(パオパオ)

すいません。調べきれず、教えてください。

シートを一括で2次元配列として取込
環境依存文字が含まれている場合、
「?」として取込されているようです。

不特定多数が使用する為、文字が限定できないのですが、
どのように対応すればよいでしょうか?

アドバイスをください。

よろしくお願いします。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


確認させてください。
 
その環境依存文字とは例えばどのようなものでしょうか?
ワークシート上ではどのように表示されているのでしょうか?
データはどこから取得したものですか?

そして、具体的に何をしようとして立ち往生しているのでしょうか?
 
ちなみに、VBEはユニコード非対応なので、
VBE上でユニコードは使用できない、ということはご存じなんですね?

(γ) 2020/06/30(火) 23:15


ありがとうございます。

環境依存文字は、「ℓ」〖等です。

ワークシート上では、表示されるのですが、
2次元配列として、データを一括取込すると、
?とすでに、変換されています。

VBAはユニコード非対応との事は、
認識していたのですが、
一括取込後に処理ができるのかな?と思っていたのですが、
取込段階で、文字化けしているので、
取り込む前に、なにかの処理をしないといけないのかな?と。
できれば、取込後に何等かの処理の方が、よいのかな?
どのような方法があるか、アドバイス頂ければと思い、
投稿しました。

よろしくお願いします。

(パオパオ) 2020/07/01(水) 06:11


>取込段階で、文字化けしているので、
というのは、ローカルウインドウ等で ?と表示されるということでしょう?
それが、VBAはユニコード非対応ということでは?

ワークシートのセルを変数で受け、
それを別のセルに書き込んだり、検索文字列にしたりしても
障害が無いはずですけど?

(γ) 2020/07/01(水) 06:31


もし、Msgboxのことでしたら、これも文字化けしますね。

検索したら Windows APIを使いなさいとのこと。

"Windows API の MessageBoxWをVBAで使うには"で検索して、↓がヒット。
https://mukkumuku.blogspot.com/2011/11/office2010-win32api-messageboxw.html
これに修正を施したのが、下記です。参考にして下さい。

Option Explicit

#If VBA7 Then
Private Declare PtrSafe Function MessageBoxW Lib "user32" ( _

                                    ByVal hwnd As LongPtr, _
                                    ByVal lpText As LongPtr, _
                                    ByVal lpCaption As LongPtr, _
                                    ByVal wType As Long _
                                    ) As Long
#Else
Private Declare Function MessageBoxW Lib "user32" ( _
                                    ByVal hwnd As Long, _
                                    ByVal lpText As Long, _
                                    ByVal lpCaption As Long, _
                                    ByVal wType As Long _
                                    ) As Long
#End If

Function MsgBoxW(Prompt As String, _

                 Optional buttons As VbMsgBoxStyle = 0, _
                 Optional title As String _
                 ) As VbMsgBoxResult

    If Len(title & "") = 0 Then title = Application.Name
    MsgBoxW = MessageBoxW(Application.hwnd, _
                          StrPtr(Prompt), _
                          StrPtr(title), _
                          buttons)
End Function
Sub test()
    Dim s As String
    s = Sheet1.[A1]  'ここに機種依存文字があるとする。
    MsgBoxW s
End Sub
これ以上のことは私にはわかならない。
(γ) 2020/07/01(水) 06:50

セル範囲をVariant型変数に入れた配列を、
別ブックに出力すると、「?」と出力されました。

ローカルウインドウで配列要素を確認すると、
「?」と表示されていました。

配列及読み込むワークシートの、
文字コードを確認しようと、試しているのですが、
ASCIIコード→63「?」 となっています。

教えていただいたコードで試してみます。

ありがとうございます。
(パオパオ) 2020/07/01(水) 23:50


 ユニコード番号を取得するには以下のようにします。

 ・AscW関数で、番号が取得できます。
 ・逆に番号から文字列を取得するには、ChrW関数を使います。

 ℓ がA1セルにある前提で、イミディエイトウインドウで
 ?AscW([A1].value)   とすると、
  8467               が返り、
 [A2].value= ChrW(8467)
 とすると、A2セルに書き込めます。

 なお、最近のExcelだと、ワークシート関数でそれに相当するものがあった記憶があります。
 調べてみてください。

(γ) 2020/07/02(木) 00:20


 > セル範囲をVariant型変数に入れた配列を、
 > 別ブックに出力すると、「?」と出力されました。 

 えホントに? と思ってやってみましたけど、やっぱ再現しませんね。

    Sub test1()
        Dim v As Variant
            [A1:A3].Value = "環境依存文字は、「" & ChrW(&H2113&) & "」" & ChrW(&H3016&) & "等です。 "
            v = [A1:A3].Value
            Workbooks.Add
            [A1:A3] = v
    End Sub

 単に、
 書き出す前に配列内の文字列に対して何か変換操作をしてるのではないですかね?
 例えば

    Sub test2()
        Dim v As Variant, i As Long
            [A1:A3].Value = "環境依存文字は、「" & ChrW(&H2113&) & "」" & ChrW(&H3016&) & "等です。 "
            v = [A1:A3].Value
            For i = 1 To 3
                v(i, 1) = StrConv(v(i, 1), vbHiragana)
            Next
            Workbooks.Add
            [A1:A3] = v
    End Sub

 これなら確かに[?]に化けてしまいます。

(白茶) 2020/07/02(木) 16:32


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.