🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

8057閲覧

VBAで機種依存文字を含んだ文字列をifの条件とする

mochisio

総合スコア20

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

1グッド

0クリップ

投稿2018/07/14 08:56

前提・実現したいこと

原セル(プルダウン方式にしている)からコピー&ペーストしても文字化けして完全に一致しないのか、r7の値が確実に0になります。
If文の条件に㎠を使いたいのですが、どうすればいいですか?

該当のソースコード

?の所に㎠を入れる予定です。

If Range("C7") = "(0)なし" Then r7 = 0 ElseIf Range("C7") = "(6)4?未満" Then r7 = 6 ElseIf Range("C7") = "(9)4?以上16?未満" Then r7 = 9 ElseIf Range("C7") = "(12)16?以上36?未満" Then r7 = 12 ElseIf Range("C7") = "(24)36?以上" Then r7 = 24 End If

補足情報(FW/ツールのバージョンなど)

microsoft Visual Basic for Aplication 7.0を使用しています。

thom.jp👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

解決済みですが、参考までに。

VBAのString型は、Office2000以降は Unicodeになってます。
ところが、VBE(コード入力画面)は、いまだに Shift-JIS のままなのです。

ですので、㎠ のようなUnicodeにはあるがShift-JISない文字は、入力しても?に文字化けします。

解決済みの回答では、独自の関数を使って解決していますが、標準でUnicode文字を表現する関数が用意されてます。

例えば、 ㎠ を表現するには、ChrW関数を使って、ChrW(13216) とします。
13216 という文字コードを調べるには、AscW関数を使います。
A1セルに ㎠ を入力して、イミディエイトウィンドウで、
?AscW(Range("A1"))
と入力してEnterキーを押せば 13216 が出力されます。

また、質問のコードですが、同じセルを何度も参照するのは無駄なので,Select Case を使うとシンプルになります。

vba

1 Dim cm2 As String 2 cm2 = ChrW(13216) 3 4 Select Case Range("C7").Value 5 Case "(0)なし" 6 r7 = 0 7 Case Replace("(6)4?未満", "?", cm2) 8 r7 = 6 9 Case Replace("(9)4?以上16?未満", "?", cm2) 10 r7 = 9 11 Case Replace("(12)16?以上36?未満", "?", cm2) 12 r7 = 12 13 Case Replace("(24)36?以上", "?", cm2) 14 r7 = 24 15 End Select

別案

対象文字列と結果を比べてみると、( )内の数値を取り出しているようなので、下記のようなコードでもよさそうです。

vba

1 Dim s As String 2 s = Range("C7").Value 3 4 If s Like "(#)*" Then 5 R7 = Val(Mid(s,2,1)) 6 ElseIf s Like "(##)*" Then 7 R7 = Val(Mid(s,2,2)) 8 End If

補足

thom.jpさんの回答のリンク先でNBSP(ノーブレークスペース)を通常の半角スペースに変換する自作関数が紹介されていますが、NBSPは、ChrW(160)で表現できます。ということで、
Replace(Range("A1").Value, ChrW(160)," ")
で変換できます。

投稿2018/07/16 18:27

編集2018/07/17 01:03
hatena19

総合スコア34073

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thom.jp

2018/07/18 13:06

知りませんでした!すばらしい。 早速ブログ追記します。
guest

0

ベストアンサー

Byte型配列を利用すると、実現できます。
以下を試してみてください。

サンプル

vba

1Sub Main() 2 If Range("C7") = "(0)なし" Then 3 r7 = 0 4 ElseIf ReplaceCM2(Range("C7")) = "(6)4<CM2>未満" Then 5 r7 = 6 6 ElseIf ReplaceCM2(Range("C7")) = "(9)4<CM2>以上16<CM2>未満" Then 7 r7 = 9 8 ElseIf ReplaceCM2(Range("C7")) = "(12)16<CM2>以上36<CM2>未満" Then 9 r7 = 12 10 ElseIf ReplaceCM2(Range("C7")) = "(24)36<CM2>以上" Then 11 r7 = 24 12 End If 13 MsgBox r7 14End Sub 15 16Function ReplaceCM2(target_string) As String 17 Dim CM2(0 To 1) As Byte 18 CM2(0) = 160 19 CM2(1) = 51 20 ReplaceCM2 = Replace(target_string, CStr(CM2), "<CM2>") 21End Function

解説

VBAにおけるString型は、内部ではバイト型配列として扱われます。2バイトで1文字です。

A1セルに㎠を入力して以下のコードを試すと、0バイト目と1バイト目の数値が取れますので、あとはそのバイトを使ってバイト型配列で文字"㎠"を作成し、"<CM2>"に変換させたのが上記のコードです。

vba

1Sub FindBytes() 2 Dim targetChar As String 3 targetChar = Left(Range("A1"), 1) 4 Dim bytes() As Byte 5 bytes = targetChar 6 Dim i As Long 7 For i = LBound(bytes) To UBound(bytes) 8 Debug.Print "bytes(" & i & "):" & bytes(i) 9 Next 10End Sub

手前味噌ですが、以下の記事で近いことをしてるのでどうぞ。
https://thom.hateblo.jp/entry/2016/09/20/150650

投稿2018/07/14 10:45

thom.jp

総合スコア686

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TanakaHiroaki

2018/07/14 11:27

VBAにおけるString型は、内部ではバイト型配列として扱われます。2バイトで1文字です。 よくわからなかったので、写経して実行すると、よく理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問