結論を先に書きますと…
Excel VBA の『Formula』や『FormulaR1C1』を使ってセルに『JIS 関数』を入れる場合、結果が『#NAME?』となることがあります。
例えば B1セルを選択した状態でイミディエイトウィンドウに
Activecell.FormulaR1C1="=JIS(RC[-1])"
と書いて Enter キーを押すと、
=@JIS(RC[-1])
と、『@』が勝手に付けられてしまうことがあります。
『@』を取り除けば JIS 関数となって結果が表示されますが、それを回避する場合は
Activecell.FormulaR1C1="=DBCS(RC[-1])"
と書いて Enter キーを押すと、
=JIS(RC[-1])
と勝手に JIS 関数に変換されて表示されます。
ちなみに私の環境は Microsoft 365 です。
Excel で2つの文字列を比較する必要がありました。
大体は完全一致なんですが、ごくごく稀に全角半角、勝手なセル内改行、いらない空白なんかが入っていることがあります。
スペースや改行は『SUBSTITUTE 関数』で取り除くんですが、その時にスペースが全角だったり半角だったりします。
そうじゃなくても、片方は半角なのにもう片方は全角だったりして、内容は一致なのに一致しないこともあります。
そういうときのために『JIS 関数』ですべて全角にするんです。
VBA では、ワークシート関数の『JIS 関数』ではなく『StrConv 関数』の方が一般的でしょうか。
StrConv("ABC", vbWide)
こう書けば、『ABC』が『ABC』になります。
でも今回は、『数式』で書きたいんですね。
セルの内容を後々変更する可能性があるので。
なので、
Activecell.FormulaR1C1="=JIS(RC[-1])"
と書いたんです。
で、実行し終わったあとのシートを見たら…。
『JIS 関数』を入力したセルがすべて『#NAME?』になっているじゃないですか!?
びっくりしてセルの中身を確かめたら、
=@JIS(RC[-1])
となっていました。
『JIS 関数』の先頭に、付けた覚えのない『@』が付いていたんです。
この『@』がつく現象、どうやら Excel の古い関数との互換性を担保するための機能らしいです。
ただ単に『@』を消してしまえば通常の『JIS 関数』として機能してくれるんですが…。
えー、そんなこと、いちいち面倒くさい。
そもそも『JIS 関数』って「古い関数」なの…?
…と、そのへんのことを重点的に調べていたら、どうやら海外版の Excel と国内版の Excel ではのように「1バイト文字を2バイト文字に変更する関数」の名称が違うようなんですね。
まー、『JIS 関数』の『JIS』は、多分『Japanese Industrial Standard Code』とかそのへん、「Japanese」とか付いている時点で日本固有っぽい感じです。
海外版の Excel では、同じ動きを『DBCS 関数』という名前の関数が担っているようです。
『DBCS』は『Double Byte Character Set』の略のようです。
そのへんの兼ね合いで、『JIS 関数』を VBA で入力させると『@』が付いてしまうようです。
…『ようです』『ようです』ですみません…。
じゃぁ、『@』を付けないようにするにはどうしたらいいか。
それが、上で書いた
Activecell.FormulaR1C1="=DBCS(RC[-1])"
と、VBA の方で『DBCS 関数』を書けば、実行が終わったあとに
=JIS(RC[-1])
と入力されています。
はー、逆転の発想的な。
『@』が付いてしまう関数は他にもあるみたいで、『INDEX 関数』とかもそのようです。
たしかに、『INDEX 関数』は2通り書き方があるのでややこしいですね。
どっちかが新しくてどっちかが古い、とかなのかなー?
『MATCH 関数』とかと組み合わせて使う方法がよく紹介されていますが、実は私は『INDEX 関数』自体をあまり使ったことがないんですよね…。
今までそういう機会がなかったので。
なので、他の『@』が勝手についてしまう関数については対処法がわからないのですが、とりあえずExcel VBA の『Formula』などで『JIS 関数』を書くと『@』が勝手についてしまう場合の対処法としては、『DBCS 関数』を書けばいい、ということみたいです。
『DBCS』って書いたのに実行後に見ると『JIS』ってなってるの、ちょっと不思議な感じです。
コメント