English

タイ語等タイプ入力

タイ語などを直接入力するには(下図)を使って設定しますが、ここでは 簡単な VBA を使ってキーボード感覚でタイプ入力できるようにしました。ここのプロシージャは極めて単純なので、 العربية アラビア語 മലയാളം マラヤーラム 語等他言語に容易に作りかえることができます。頻繁に使うのであれば、コントロールパネルの 『 地域と言語のオプション 』 → 『 言語 』 タブの 『 詳細 』 で図のダイアログボックスから指定した言語が追加され便利です。ツールバーにアイコンが表示され、必要に応じ切り替えることになります。

タイプ入力の概要

図1.キーボード

図2.


以下 Word でのタイ語について記述します。( Excel でも実行できます。末尾参照) 図1.はタイ語キーボード配列の例です。小さい文字は拡大表示しています。

図2.のようにカーソル位置で VBA 実行するとキーボード入力のタイ文字が挿入されます。

VBA を起動して InputBox にキーボードからタイプし、例えば "8" のキー なら以下の対応表から "ค" の文字がカーソル位置に挿入されます。InputBox には通常一度に複数文字を半角英数での書き込み Enter を押します。該当するキーボード文字 ( kAr() ) がない場合は InputBox で入力した文字がそのまま出力されます。InputBox には default が表示されますが不必要な場合(不必要の方が多い)、その都度消去などしないで完全無視してタイプします。

漢字なども使えるようにし、例えば "水" と入力し น้ำ が出力できるようにしてあります。

VBA プロシージャの概略と変更

対応表
Thai十進数16進数kAr()
135850E01d
235860E02-
335870E03]
435880E048
535890E05}
635900E06S
735910E07:
835920E080
935930E09C
1035940E0A^
1135950E0B+
1235960E0CG
1335970E0DP
1435980E0EE
1535990E0FD
1636000E10`
1736010E11R
1836020E12<
1936030E13I
2036040E14f
2136050E159
2236060E165
2336070E17m
2436080E18T
2536090E19o
2636100E1A@
2736110E1Bx
2836120E1Cz
2936130E1D/
3036140E1Er
3136150E1Fa
3236160E204
3336170E21,
3436180E22p
3536190E23i
3636200E24A
3736210E25[
3836220E26?
3936230E27;
4036240E28L
4136250E29K
4236260E2Al
4336270E2Bs
4436280E2C>
4536290E2Dv
4636300E2EV
4736310E2FO
4836320E30t
4936330E31y
5036340E32k
5136350E33e
5236360E34b
5336370E35u
5436380E367
5536390E37n
5636400E386
5736410E39&
5836420E3A
5936430E3B
6036440E3C
6136450E3D
6236460E3E
63฿36470E3F'
6436480E40g
6536490E41c
6636500E42F
6736510E43.
6836520E44w
6936530E45
7036540E46q
7136550E47H
7236560E48j
7336570E49h
7436580E4AU
7536590E4BJ
7636600E4CN
7736610E4D
7836620E4E
7936630E4F
8036640E50Q
8136650E51"
8236660E52#
8336670E53$
8436680E54%
8536690E55(
8636700E56)
8736710E57_
8836720E58=
8936730E59~
9036740E5A
9136750E5B


変数など

文字番号、タイ文字、Unicode 十進数と16進数、キーボード文字の対応表を左に表示しています。

kAr() には ( Keyboard の文字 ) が番号順に格納されます。例えば "ก"を表示するため kAr(1) には "d" が入ります。タイキーボードで ๗ の文字 (87番目) は Shift + 0 (ゼロ) ですが、文字が表示できないのでここでは アンダースコア 『 _ 』 で代用しています。

VBA コードは一部改訂により行ナンバーがずれていますが、以前のバージョンのままにしています。

(6行目) の a は Unicode 十進数の最初の数字、x, y は InputBox の表示位置で、邪魔にならない場所に変更できます。 (11行目)に

  s = Replace(s, "水","ohe") 

とありますが、必要に応じて入力全角文字とキーボード文字対応を (11行目)〜(13行目) に挿入し何個でも追加することができます。全角文字は "みず" のように複数の文字を使っても構いません。例えば

         s = Replace(s, "目", "9k")
         s = Replace(s, "固", "c-H:")

を追加しておいて、"目"、"固" で "目" や "固い" のタイ語、また "水目" や "水固" と入力して "泪 (น้ำตา )"、 "氷 (น้ำแข็ง )" の単語を出力させることができます。

また、 s = Replace(s, "好", "CyoiydgTv") を追加挿入しておいて "好" の文字でよく使うお好みのフレーズを出力させることも考えられます。

ดู พจนานุกรม (別枠表示)

他言語への変更

他言語に作り替えるには (6行目) の a を変更し、新しいキーボード文字対応の配列変数 kAr() を作成するだけでOKです。

他言語の実例

例えば a = 3330 とし、w を次のようにするとマラヤーラム語に変身します。

    w = " x =  D E F R G T ~   Z S W   A Q k K i I U" & _
        " ; + p P { : * @ ` C l L o O v  h H y Y c / j J" & _
        " n N B b M < m u     e f r g t ^   z s w   a q d" & _
        "                   |      0 1 2 3 4 5 6 7 8 9     "

また a=1548 とし, w を

   w = " K               P    ?  x N H c Y  h f m j e @ p o [  v . s a w q : / u" & _
     " y       t r ; g l  i , n d W R A Q E S                X  "

とするとアラビア語になり、文字は左方向に挿入されます。

a=1025

   W = " ?               F < D U L T + P B Q R K V Y J G H C N E A ` W X I O" & _
   " { S M * > Z f M d u l t ; p b q r k v y j g h c n e a @ w x i o [ s m : . z _ "

ではロシア語になります。

当然のことですがこのままではタイの長い首都名等は正しく表示されません。

独自の言語に変更(1) 対応表の作成

Excel で新しい言語の対応表を作成します。十六進数は必ずしも必要ではありません。。取り敢えず、表見出しも含めここの対応表と同じ書式で オートフィル等利用して作成します。2列目の文字は以下を実行すれば埋まります。

Set c = Range("b2"): a = c.Range("b1").Value
 For i = 1 To 91
   c.Cells(i, 1).Value = ChrW(a + i - 1)
 Next

c は最初のセルで ワークシートの B2 セル、 a、 91 はタイ語の場合での 最初の文字十進数 (3585)および領域数です。

独自の言語に変更(2) kAr() の作成

キーボード文字を配列変数 kAr() に割り当てるには対応表を参照しながら

kAr(1)="d": kAr(2)="-": kAr(3)="]": kAr(4)="8": kAr(5)="}": ……

などと単純に列記するのが簡単です注*。キーボードの文字は最大でも 100文字もないので面倒でもこの方が良いでしょう。その場合、(1行目) は Dim kAr(##) などとし (2行目)〜(5行目) は削除します。## の数字は Unicode 文字領域数( ここの対応表では ## は 91 )です。

コード (2 〜4 行目) の文字列を独自に作成するには対応表の 5列目部分を選択したうえで、

 w=" ": for each c in selection: w= w & c.value & " ": next: ?w

を Excel イミディエイト・ウインドウで実行すると文字列結合注**されて簡単です。最後の space はあっても無くても構いません。VBA で特別な意味を持つ引用符 『 " 』に注意しないとエラーが出たり対応関係がずれてしまったりします。

注*kAr() に割り当てる少し簡単な方法があります。Excel の文字の対応表で
=IF(E2="","","kAr("&A2&")="&CHAR(34)&E2&CHAR(34)&":")
を F2 セルに入力すると kAr(1)="d": となります。これを表末尾までコピーして値のみの貼り付けにします。F 列の文字部分を選択し文字列の結合注**を応用すれば自動的にできます。

余録

Shift を使って表示される文字がコンピューターによっては異なることがあります。また、キーボード配列は何種かあるようです。不具合があれば適宜 kAr() を変更する必要があります。

(17行目) の 『 .InsertAfter vbCr: .Start = .End - 1: .Delete 』 の部分は筆者が InsertAfter の理解不足で記入した部分です。これが無いと InputBox を閉じないと挿入文字が表示されないからです。

Excel で実行する場合は、アクティブセルに入力され、入力後は下のセルに移ります。なお(行番号) はこのページでの記述の便宜上だけなので、再編集の時には削除したほうがよいです。

関連ページ  (Excel VBA 正規表現利用の) タイ文字の読み (ローマ字表記)

 VBA 実行とイミディエイト、 VBAマクロ作成のヒント


Sub typethai()
Dim kAr                  '=Word (Excel)タイ語キー入力 Ver. 3.2.1 =====                     ' 1
w = " d - ] 8 } S : 0 C ^ + G P E D ` R < I f 9 5 m T o @ x z / r a 4 , p i A [ ? ; L" & _
  " K l s > v V O t y k e b u 7 n 6 &      ' g c F . w  q H j h U J N    Q " & Chr(34) & _
  " # $ % ( ) _ = ~ "                                                                 '4
 kAr = Split(w)                                                                              '5
  a = 3585: x = 100: y = 100: w = "最も長い首都名": kAr(0) = "di6:gmrO"                      '6
  If InStr(Application.Name, "Excel") Then Ap = "Excel"
myLoop:                                                                                      '7
   s = InputBox(kAr(0) & " とタイプすると" & w & _
      " が挿入されます。" & vbCr & "終了はキャンセル", "Type In", kAr(0), x, y)              '9
      w = "前回入力と同じ": kAr(0) = s:   If s = "" Then End                                '10
         s = Replace(s, "水", "ohe")                                                        '11
     
     For i = 1 To UBound(kAr)                                                               '13
         s = Replace(s, kAr(i), ChrW(a + i - 1))                                            '14
     Next                                                                                   '15
If Ap = "Excel" Then ActiveCell.Value = s: ActiveCell.Range("a2").Activate: GoTo myLoop
   With Selection                                                                           '16
     .InsertAfter Text:=s: .InsertAfter vbCr: .Start = .End - 1: .Delete                    '17
   End With                                                                                 '18
  GoTo myLoop                                                                               '19
End Sub


このサイトで扱った項目