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

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のお題(悪魔のCSV)をやってみた
「VBAで導関数を求めよ」ツイッターのお題をやってみた
ツイッターのお題「君の名は?」
ツイッターのお題「CSV編集」
アルファベットの26進(ツイッターお題)
ナンバープレート数字遊び:ツイッターお題
サロゲートペアに対応した自作関数(Len,Left,Mid,Right)
迷路にネコが挑戦したら、どうなるかな…
迷路ネコが影分身の術を体得したら…


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

列全体を指定する時のRangeとColumnsの違い|ツイッター出題回答 (2023-09-24)
シートのActiveXチェックボックスの指定方法|ツイッター出題回答 (2023-09-24)
ByRef引数の型が一致しません。|ツイッター出題回答 (2023-09-22)
シートコピー後のアクティブシートは何か|ツイッター出題回答 (2023-09-19)
Excel関数の引数を省略した場合について|ツイッター出題回答 (2023-09-14)
セル個数を返すRange.CountLargeプロパティとは|VBA技術解説(2023-09-08)
記号を繰り返してグラフ作成(10単位で折り返す)|ツイッター出題回答 (2023-08-28)
シートを削除:不定数のシート名に対応|VBAサンプル集(2023-08-24)
ランクによりボイントを付ける(同順位はポイントを分割)|ツイッター出題回答 (2023-08-22)
OneDrive使用時のThisWorkbook.Pathの扱い方|VBA技術解説(2023-07-26)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.マクロとは?VBAとは?VBAでできること|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.条件分岐(IF)|VBA入門




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


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



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