エクセル雑感
ツイッターのお題「君の名は?」

ExcelマクロVBAとエクセル関数についての私的雑感
最終更新日:2020-02-24

ツイッターのお題「君の名は?」


ツイッターで出題されたVBAの問題をやってみました。
ツイッターのエクセルおよびVBA関係の人達の間で問題を出し合うという事が行われています。
今回のお題は以下になります。

ツイートへのリンク

お題:君の名は?

"-"ちゃんの名前がわかりません!
教えてください。
VBA マクロ ツイッターお題


ツイッターで回答したので、その記録です。


回答した名前を返す関数のVBAコード



Function 名前を教えて(ByVal aName As String) As String
  Dim arySymbolNum, arySymbol, aryName
  arySymbolNum = Array(65293, 45, 8208, 8722, 8210, 8212, 8211, 8213, 12540, 65392, 9472, 9473, 19968)
  aryName = Array("全角ハイフンマイナス", "半角ハイフンマイナス", "全角ハイフン", "全角マイナス", _
          "フィギュアダッシュ", "全角ダッシュ", "二分ダッシュ", "ホリゾンタルバー", _
          "全角長音", "半角長音", "罫線細", "罫線太", "いち")

  Dim i As Long
  arySymbol = ""
  For i = LBound(arySymbolNum) To UBound(arySymbolNum)
    arySymbol = arySymbol & ChrW(arySymbolNum(i))
  Next
  
  Dim ix As Long
  ix = InStr(arySymbol, aName)
  If ix = 0 Then
    名前を教えて = "知らん"
  Else
    名前を教えて = aryName(ix - 1)
  End If
End Function

この問題の難しいところは、これらの記号がVBAでは直接文字列として入力できない事にあります。
VBEの文字コードはShift_JISなので、先の文字の多くは入力しても"?"となってしまいます。
そこで、このVBAではUnicodeで入力して、ChrWで文字列に変換しています。
文字コードの詳細については以下を参照してください。
VBA技術解説マクロでShift_JIS文字コードか判定する
環境依存文字・機種依存文字をチェックしたいという話は時々聞くことなのですが、何をもってして判別するかという事が実はとても難しい問題になります、①②もIMEでは[環境依存]と表示されますが、通常これが問題になる事はないでしょう。そもそもコンピューターの中は2進数だけで表現されているもので、コンピューターの文字とは、

Byte配列と文字コード関数について
マクロVBAのデータ型にByte型がありますが、使う機会はかなり限られています。バイト型は、8ビット(1バイト)の変数で、0~255の範囲の単精度の正の数値が格納されます。1バイトで使う事もなくはありませんが、Byte型配列として使われることがしばしばあります。

文字コードから文字列に変換後は配列にしても良いのですが、
1文字判定に限定するならInStr関数で位置を取得したほうが早そうだと思い、文字列結合で処理してみました。
このあたりは、いろいろなやり方が考えられるところです。

テスト実行

まず、そもそもテストするための文字をVBAでは入れられないので、そこはシートにしました。

マクロ VBA ツイッターのお題

この文字を関数に渡して、返り値をイミディエイトに出力します。



Sub test()
  Dim i As Long
  For i = 1 To 14
    Debug.Print 名前を教えて(Cells(i, 1))
  Next
End Sub

マクロ VBA ツイッターのお題

一応、無事出力されているようです。



同じテーマ「エクセル雑感」の記事

「VBAによる解析シリーズその2 カッコ」をやってみた
ツイッターで出されたVBAのお題をやってみた
「VBAで導関数を求めよ」ツイッターのお題をやってみた
ツイッターのお題「君の名は?」
ツイッターのお題「CSV編集」
アルファベットの26進(ツイッターお題)
ナンバープレート数字遊び:ツイッターお題
保護されたブックの非表示シートについて
文字列のセルだけ結合
時間に関する関数の扱い方
COUNTIF関数の結果は?


新着記事NEW ・・・新着記事一覧を見る

import文(パッケージ・モジュールのインポート)|Python入門(9月24日)
例外処理(try文)とexception一覧|Python入門(9月23日)
リスト内包表記|Python入門(9月22日)
Pythonの引数は参照渡しだが・・・|Python入門(9月21日)
lambda(ラムダ式、無名関数)と三項演算子|Python入門(9月20日)
関数内関数(関数のネスト)とスコープ|Python入門(9月18日)
関数の定義(def文)と引数|Python入門(9月18日)
組み込み関数一覧|Python入門(9月17日)
辞書(dict型)|Python入門(9月16日)
入力規則への貼り付けを禁止する|VBA技術解説(9月16日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ