久々の更新です。

VBScriptよりも、時代はpowershellなのでしょうけれども、
Excelとの相性の良さは何事にも変えられない(大笑)ので、
何だかんだ言いつつVBScriptを時々使ってます。

powershellでcom解放って面倒そうだし。 Excel解放は、.NETで散々苦労しているので、やりたくないし。
そもそも、歳でpowershellが覚えられないし(爆)

……冗談はここまでにして。(^^ゞ

真面目な話、VBScriptだとExcelの扱いが、かなり楽なんですよ。

フォルダ単位でドロップしたcsvファイルのデータを複数(20数個)拾って、
一気にExcelで表を作ってしまうVBScriptを組んだんですよ。
(こっちは本題では無いので、詳細はパス)



こっからが本題!!

作っていて、「……そう言えば、VBScriptには、StrConvみたいなモンがないなぁ……Replace面倒だし」
特に全角英数や半角カナが厄介でねー。

というわけで、一度作って見るかと。(^^ゞ
ループでグルグル回すのは“こんがらがって”嫌だし(爆)
第一、arrayだと好みじゃない
replaceもなぁ……
で、Dictionaryを使ってみることに決定
イロイロ考えた末に、関数ではなくクラスにすることにしました(VBScriptもクラス作れます)

ちなみに、こんなのも作って見ました「JavaScriptで半角全角変換を担当するクラスを作ってみた


文字変換クラス CharWideNarrow
Class CharWideNarrow
	Dim  widedicASCII, widedicANK, narrowdicASCII, narrowdicANK
	Dim x
	Private Sub Class_Initialize()
		'コンストラクタ
		Set widedicASCII   = CreateObject("Scripting.Dictionary")
		Set widedicANK     = CreateObject("Scripting.Dictionary")
		Set narrowdicASCII = CreateObject("Scripting.Dictionary")
		Set narrowdicANK   = CreateObject("Scripting.Dictionary")

		With narrowdicANK
			'表の作成
			.Add "゜", "゚"
			.Add "゛", "゙"
			.Add "ヶ", "ケ"
			.Add "ヵ", "カ"
			.Add "ヴ", "ヴ"
			.Add "ン", "ン"
			.Add "ヲ", "ヲ"
			.Add "ヱ", "ウェ"
			.Add "ヰ", "ウィ"
			.Add "ワ", "ワ"
			.Add "ヮ", "ワ"
			.Add "ロ", "ロ"
			.Add "レ", "レ"
			.Add "ル", "ル"
			.Add "リ", "リ"
			.Add "ラ", "ラ"
			.Add "ヨ", "ヨ"
			.Add "ョ", "ョ"
			.Add "ユ", "ユ"
			.Add "ュ", "ュ"
			.Add "ヤ", "ヤ"
			.Add "ャ", "ャ"
			.Add "モ", "モ"
			.Add "メ", "メ"
			.Add "ム", "ム"
			.Add "ミ", "ミ"
			.Add "マ", "マ"
			.Add "ポ", "ポ"
			.Add "ボ", "ボ"
			.Add "ホ", "ホ"
			.Add "ペ", "ペ"
			.Add "ベ", "ベ"
			.Add "ヘ", "ヘ"
			.Add "プ", "プ"
			.Add "ブ", "ブ"
			.Add "フ", "フ"
			.Add "ピ", "ピ"
			.Add "ビ", "ビ"
			.Add "ヒ", "ヒ"
			.Add "パ", "パ"
			.Add "バ", "バ"
			.Add "ハ", "ハ"
			.Add "ノ", "ノ"
			.Add "ネ", "ネ"
			.Add "ヌ", "ヌ"
			.Add "ニ", "ニ"
			.Add "ナ", "ナ"
			.Add "ド", "ド"
			.Add "ト", "ト"
			.Add "デ", "デ"
			.Add "テ", "テ"
			.Add "ヅ", "ヅ"
			.Add "ツ", "ツ"
			.Add "ッ", "ッ"
			.Add "ヂ", "ヂ"
			.Add "チ", "チ"
			.Add "ダ", "ダ"
			.Add "タ", "タ"
			.Add "ゾ", "ゾ"
			.Add "ソ", "ソ"
			.Add "ゼ", "ゼ"
			.Add "セ", "セ"
			.Add "ズ", "ズ"
			.Add "ス", "ス"
			.Add "ジ", "ジ"
			.Add "シ", "シ"
			.Add "ザ", "ザ"
			.Add "サ", "サ"
			.Add "ゴ", "ゴ"
			.Add "コ", "コ"
			.Add "ゲ", "ゲ"
			.Add "ケ", "ケ"
			.Add "グ", "グ"
			.Add "ク", "ク"
			.Add "ギ", "ギ"
			.Add "キ", "キ"
			.Add "ガ", "ガ"
			.Add "カ", "カ"
			.Add "オ", "オ"
			.Add "ォ", "ォ"
			.Add "エ", "エ"
			.Add "ェ", "ェ"
			.Add "ウ", "ウ"
			.Add "ゥ", "ゥ"
			.Add "イ", "イ"
			.Add "ィ", "ィ"
			.Add "ア", "ア"
			.Add "ァ", "ァ"
			.Add "ー", "ー"
			.Add "・", "・"
			.Add "、", "、"
			.Add "」", "」"
			.Add "「", "「"
			.Add "。", "。"

			'逆引き表の作成
			For Each x In .Keys
				If widedicANK.Exists( .Item(x) ) = False Then
					widedicANK.Add .Item(x), x
				End If
			Next
		End With

		With narrowdicASCII
			'表の作成
			.Add "~", "~"
			.Add "}", "}"
			.Add "|", "|"
			.Add "{", "{"
			.Add "z", "z"
			.Add "y", "y"
			.Add "x", "x"
			.Add "w", "w"
			.Add "v", "v"
			.Add "u", "u"
			.Add "t", "t"
			.Add "s", "s"
			.Add "r", "r"
			.Add "q", "q"
			.Add "p", "p"
			.Add "o", "o"
			.Add "n", "n"
			.Add "m", "m"
			.Add "l", "l"
			.Add "k", "k"
			.Add "j", "j"
			.Add "i", "i"
			.Add "h", "h"
			.Add "g", "g"
			.Add "f", "f"
			.Add "e", "e"
			.Add "d", "d"
			.Add "c", "c"
			.Add "b", "b"
			.Add "a", "a"
			.Add "‘", "`"
			.Add "_", "_"
			.Add "^", "^"
			.Add "]", "]"
			.Add "¥", "\"
			.Add "[", "["
			.Add "Z", "Z"
			.Add "Y", "Y"
			.Add "X", "X"
			.Add "W", "W"
			.Add "V", "V"
			.Add "U", "U"
			.Add "T", "T"
			.Add "S", "S"
			.Add "R", "R"
			.Add "Q", "Q"
			.Add "P", "P"
			.Add "O", "O"
			.Add "N", "N"
			.Add "M", "M"
			.Add "L", "L"
			.Add "K", "K"
			.Add "J", "J"
			.Add "I", "I"
			.Add "H", "H"
			.Add "G", "G"
			.Add "F", "F"
			.Add "E", "E"
			.Add "D", "D"
			.Add "C", "C"
			.Add "B", "B"
			.Add "A", "A"
			.Add "@", "@"
			.Add "?", "?"
			.Add ">", ">"
			.Add "=", "="
			.Add "<", "<"
			.Add ";", ";"
			.Add ":", ":"
			.Add "9", "9"
			.Add "8", "8"
			.Add "7", "7"
			.Add "6", "6"
			.Add "5", "5"
			.Add "4", "4"
			.Add "3", "3"
			.Add "2", "2"
			.Add "1", "1"
			.Add "0", "0"
			.Add "/", "/"
			.Add ".", "."
			.Add "-", "-"
			.Add ",", ","
			.Add "+", "+"
			.Add "*", "*"
			.Add ")", ")"
			.Add "(", "("
			.Add "’", "'"
			.Add "&", "&"
			.Add "%", "%"
			.Add "$", "$"
			.Add "#", "#"
			.Add "”", """"
			.Add "!", "!"
			.Add " ", " "

			'逆引き表の作成
			For Each x In .Keys
				 widedicASCII.Add .Item(x), x
			Next
		End With
	End Sub

	Private Sub Class_Terminated()
		'デストラクタ
		Set widedicASCII   = Nothing
		Set widedicANK     = Nothing
		Set narrowdicASCII = Nothing
		Set narrowdicANK   = Nothing
	End Sub

	Function ToNarrowAll( byref str )
		Dim rtn, max_, char_, trns_
		rtn = ""
		max_ = len( str )
		For i = 1 to max_
			char_ = Mid( str,i,1 )
			If narrowdicASCII.Exists( char_ ) Then
				trns_ = narrowdicASCII.Item( char_ )
			Else
				If narrowdicANK.Exists( char_ ) Then
					trns_ = narrowdicANK.Item( char_ )
				Else
					trns_ = char_
				End If
			End If
			rtn = rtn & trns_
		Next 
		ToNarrowAll = rtn
	End Function

	Function ToNarrowASCII( byref str )
		Dim rtn, max_, char_, trns_
		rtn = ""
		max_ = len( str )
		For i = 1 to max_
			char_ = Mid( str,i,1 )
			If narrowdicASCII.Exists( char_ ) Then
				trns_ = narrowdicASCII.Item( char_ )
			Else
				trns_ = char_
			End If
			rtn = rtn & trns_
		Next 
		ToNarrowASCII = rtn
	End Function

	Function ToNarrowKANA( byref str )
		Dim rtn, max_, char_, trns_
		rtn = ""
		max_ = len( str )
		For i = 1 to max_
			char_ = Mid( str,i,1 )
			If narrowdicANK.Exists( char_ ) Then
				trns_ = narrowdicANK.Item( char_ )
			Else
				trns_ = char_
			End If
			rtn = rtn & trns_
		Next 
		ToNarrowKANA = rtn
	End Function

	Function ToWideAll( byref str , byval option_ )
		Dim rtn, max_, char_, trns_, next_c, flg_nextc_trns
		rtn = ""
		max_ = len( str ) - 1
		flg_nextc_trns = False
		For i = 1 to max_
			If flg_nextc_trns = True Then
				flg_nextc_trns = False
			Else
				char_  = Mid( str, i   , 1 )
				next_c = Mid( str, i+1 , 1 )

				Select Case next_c
				Case "゚" , "゙" 
					If widedicANK.Exists( char_ & next_c ) Then
						char_ = char_ & next_c
						flg_nextc_trns = True
					End If				
				Case "ィ" , "ェ"
					If Option_ Then
						If widedicANK.Exists( char_ & next_c ) Then
							char_ = char_ & next_c
							flg_nextc_trns = True
						End If
					End If				
				Case Else
				End Select

				If widedicASCII.Exists( char_ ) Then
					trns_ = widedicASCII.Item( char_ )
				Else
					If widedicANK.Exists( char_ ) Then
						trns_ = widedicANK.Item( char_ )
					Else
						trns_ = char_
					End If
				End If
				rtn = rtn & trns_
			End If
		Next

		If flg_nextc_trns = False Then
			char_  = Right( str, 1 )
			If widedicASCII.Exists( char_ ) Then
				trns_ = widedicASCII.Item( char_ )
			Else
				If widedicANK.Exists( char_ ) Then
					trns_ = widedicANK.Item( char_ )
				Else
					trns_ = char_
				End If
			End If
			rtn = rtn & trns_
		End If

		ToWideAll = rtn
	End Function

	Function ToWideASCII( byref str )
		Dim rtn, max_, char_, trns_
		rtn = ""
		max_ = len( str )
		For i = 1 to max_
			char_  = Mid( str,i, 1 )
			If widedicASCII.Exists( char_ ) Then
				trns_ = widedicASCII.Item( char_ )
			Else
				trns_ = char_
			End If
			rtn = rtn & trns_
		Next

		ToWideASCII = rtn
	End Function

	Function ToWideKANA( byref str , byval option_ )
		Dim rtn, max_, char_, trns_, next_c, flg_nextc_trns
		rtn = ""
		max_ = len( str ) - 1
		flg_nextc_trns = False
		For i = 1 to max_
			If flg_nextc_trns = True Then
				flg_nextc_trns = False
			Else
				char_  = Mid( str, i   , 1 )
				next_c = Mid( str, i+1 , 1 )

				Select Case next_c
				Case "゚" , "゙"
					If widedicANK.Exists( char_ & next_c ) Then
						char_ = char_ & next_c
						flg_nextc_trns = True
					End If				
				Case "ィ" , "ェ"
					If option_ Then
						If widedicANK.Exists( char_ & next_c ) Then
							char_ = char_ & next_c
							flg_nextc_trns = True
						End If
					End If				
				Case Else
				End Select

				If widedicANK.Exists( char_ ) Then
					trns_ = widedicANK.Item( char_ )
				Else
					trns_ = char_
				End If
				rtn = rtn & trns_
			End If
		Next

		If flg_nextc_trns = False Then
			char_  = Right( str, 1 )
			If widedicANK.Exists( char_ ) Then
				trns_ = widedicANK.Item( char_ )
			Else
				trns_ = char_
			End If
			rtn = rtn & trns_
		End If

		ToWideKANA = rtn
	End Function
End Class
クラスのメソッドは6つ
ToNarrowAll(str)          変換可能な全角文字を、半角に変換(英数字記号、およびカタカナ)
ToNarrowASCII(str)        全角英数字記号を、半角に変換
ToNarrowKANA(str)        全角カタカナを、半角に変換
ToWideAll(str,option)       変換可能な半角文字を、全角に変換(英数字記号、およびカタカナ)
ToWideASCII(str)         半角英数字記号を、全角に変換
ToWideKANA(str,option)     半角カタカナを、全角に変換

尚、ToWide系の第二引数のoptionは、
「ウィ」を「ヰ」(ニッカウヰスキーとか)、「ウェ」を「ヱ」(ヱヴァとか)に変換するかどうかを決めます。
Trueならば、「ヰ」「ヱ」になります(使う方いないですよねぇ……きっと。ほら、文字コード表にあったもんで、つい)


実際に使ってみる場合は、こんな感じで使用します。
変換前と変換後が上下に表示されます

「CharWideNarrow」クラス、使用サンプルコード(クラスと同じファイル内に書いてね!!)
dim c
set c = New CharWideNarrow
test = "@+~!#$%&’(){123}「ヴェルサイユポータルサイドヱヰ」"
test2 = "@+~!#$%&'(){123}「ヴェルサイユポータルサイドウェウィ」"

msgbox(test & chr(10) & c.ToNarrowAll(test)) 
msgbox(test &  chr(10) & c.ToNarrowASCII(test)) 
msgbox(test &  chr(10) & c.ToNarrowKANA(test)) 
msgbox(test2 &  chr(10) & c.ToWideAll(test2,0)) 
msgbox(test2 &  chr(10) & c.ToWideASCII(test2)) 
msgbox(test2 &  chr(10) & c.ToWideKANA(test2,1)) 


……文字列のReplaceもしなけりゃ、変換表のループもしない(元の文字列に対してはするけれど;笑)
ややこしいところは、全て「Scripting.Dictionary」に“丸投げ”してます。(^_^;)
その方が、自力でグルグル回すよりも処理が速そうだったので。

変換表を作ることが、だたひたすら面倒だったです……。
逆引き表はループで簡単に作ってます(手抜き)。

… … … … …

コンピュータ黎明時代に、無理矢理とは言え、
よくぞ独自に日本語を扱わせることを思いついたよなぁ……当時の人は。
(学校の実験装置がそのタイプで、正直読み辛かったです……8インチのフロッピーって知ってます? 大笑)

では、また。