ツイッター出題回答
小文字"abc"を大文字"ABC"に変換する方法

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

小文字"abc"を大文字"ABC"に変換する方法


ツイッターで出した「VBA問題」です。
小文字"abc"を大文字"ABC"に変換する方法を可能な限り列挙してください。という問題です。。



出題ツイート

マクロVBA VBA問題
https://twitter.com/yamaoka_ss/status/1425799283303882758


「VBA問題」
小文字"abc"を大文字"ABC"に変換する方法を可能な限り列挙してください。
Dim s: s = "abc"
この変数sの値を"ABC"に変換出来れば良い。
手法が分かれば実際のVBAコードは無くても良い。
※変換後の"ABC"をセル値やVBA内リテラルで持つのは禁止。


私の想定全てが出た時点で終わりとします。
逆の言い方をすれば、
_人人人人人人人人人人人人_
> 全部出るまで待ちます <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
もちろん、私の想定外もあるとは思いますが、それについては私が勉強させてもらったという事で、そのまま続行します。


変な勘繰りは不要です。
単純に"abc"の3文字を"ABC"に変換出来れば良いです。
他の文字が云々とか考える必要もないです。
純粋に手法をどれだけ知っているかを問う問題です。


回答ツイート

解答ツイート

マクロVBA VBA問題
https://twitter.com/yamaoka_ss/status/1426077413880958980


「VBA問題 解答」
私の想定した方法は大きく分類すると、
✅UCase関数
✅StrConv関数
✅文字コード減算
✅UPPER関数
✅SendKeys
✅Format関数
ここまで。
以下は頂いた回答より
✅列名を利用
✅8.3形式のファイル名を利用
✅Hexを利用
✅htmlfile利用
✅VBProject利用
順にVBAコードを紹介します。


出題者からの解答

UCase関数

'UCASE関数
Sub proc1()
  Dim s: s = "abc"
  s = UCase(s)
  Debug.Print s
End Sub


StrConv関数



'StrConv関数
Sub proc2()
  Dim s: s = "abc"
  s = StrConv(s, vbUpperCase)
  Debug.Print s
End Sub


文字コード減算

'文字コード減算
Sub proc3()
  Dim s: s = "abc"
  Dim i
  For i = 1 To Len(s)
    Mid(s, i, 1) = Chr(Asc(Mid(s, i, 1)) - 32)
  Next
  Debug.Print s
End Sub

'文字コード減算:バイト配列使用
Sub proc4()
  Dim s: s = "abc"
  Dim b() As Byte
  b = s
  Dim i
  For i = LBound(b) To UBound(b) Step 2
    b(i) = b(i) - 32
  Next
  s = b
  Debug.Print s
End Sub


UPPER関数

'セルでUPPER関数
Sub proc5()
  Dim s: s = "abc"
  Range("A1").Value = s
  Range("A2").FormulaLocal = "=UPPER(A1)"
  s = Range("A2").Value
  Range("A1:A2").Clear
  Debug.Print s
End Sub

'EvaluateでUPPER関数
Sub proc6()
  Dim s: s = "abc"
  s = Evaluate("UPPER(""" & s & """)")
  Debug.Print s
End Sub


SendKeys

ユーザーフォーム使用


'SendKeys:ユーザーフォーム使用、TextBox1だけ作成
Sub proc7()
  Dim s: s = "abc"
  Dim frm As New UserForm1
  frm.Show vbModeless
  frm.TextBox1.SetFocus
  frm.TextBox1.IMEMode = fmIMEModeDisable 'これ必要です
  SendKeys "+(" & s & ")", True
  DoEvents
  s = frm.TextBox1.Text
  Unload frm
  Set frm = Nothing
  Debug.Print s
End Sub

'Application.SendKeysはNumLockが外れてしまうのでWSH.SendKeysでラップ関数作成
Public Function SendKeys(InpKeys As String, Optional Wait As Boolean = False)
  Static WSH As Object
  If WSH Is Nothing Then
    Set WSH = CreateObject("WScript.Shell")
  End If
  WSH.SendKeys InpKeys
End Function

メモ帳使用
'SendKeys:メモ帳使用
Sub proc8()
  Dim s: s = "abc"
  Call Shell("notepad.exe", vbNormalFocus)
  AppActivate "メモ帳"
  SendKeys "+(" & s & ")", True
  SendKeys "^(ac)", True
  SendKeys "%{F4}", True
  SendKeys "%n", True
  Application.Wait Now() + TimeSerial(0, 0, 1) 'とりあえず適当です
  With New DataObject
    .GetFromClipboard
    s = .GetText
  End With
  Debug.Print s
End Sub

SendKeysは先のWSH.SendKeysを使用


Format関数

'Format関数使用
Sub proc9()
  Dim s: s = "abc"
  s = Format(s, ">")
  Debug.Print s
End Sub


以下は、私の想定外の回答より抜粋
頂いた案を基に私が書いたものと、頂いたコードをほぼそのまま再現したものがあります。

列名を利用:@AcornDeさん

'@AcornDe さん:列名を利用
Sub proc10()
  Dim s: s = "abc"
  Dim i
  For i = 1 To Len(s)
    Mid(s, i, 1) = Split(Columns(Mid(s, i, 1)).Address(False, False), ":")(0)
  Next
  Debug.Print s
End Sub

エクセルのアルファベット変換では定番ですが、今回の問題ではなかなか思いつかない。


8.3形式のファイル名を利用:@furyuteiさん

'@furyuteiさん:8.3形式のファイル名を利用
Sub proc11()
  Dim s: s = "abc"
  Dim fso As New filesystemobject
  Dim TempFolder: TempFolder = fso.GetSpecialFolder(temporaryfolder) & "\" & s & " _"
  On Error Resume Next
  fso.CreateFolder TempFolder
  s = Left(fso.GetFolder(TempFolder).ShortName, 3)
  fso.DeleteFolder TempFolder
  Debug.Print s
End Sub

これはなかなか思いつかない


Hexを利用:@furyuteiさん

'@furyutei さん:Hexを利用
Sub proc12()
  Dim s: s = "abc"
  s = Hex("&H" & s)
  Debug.Print s
End Sub

Fまで限定ですが発想がステキ


htmlfile利用:@10767さん

'@10767 さん:htmlfile利用
Sub proc13()
  Dim s: s = "abc"
  Dim o As Object
  Set o = CreateObject("htmlfile")
  o.write "<HTML><HEAD></HEAD><BODY><" & s & "></BODY></HTML>"
  Debug.Print o.body.innerHTML
End Sub

私の環境で大文字になりませんが・・・

@furyuteiさんが簡単な方法をツイートしてくれました。

マクロVBA VBA問題
https://twitter.com/furyutei/status/1426089195072737282


VBProject利用:@ExcelHolicさん

'@ExcelHolicさん:VBProject利用
Sub proc105()
  Dim s: s = "abc"
  Dim codeString As String
  codeString = "sub created_code():dim x as byte:call msgbox():end sub"
  Call ThisWorkbook.VBProject.VBComponents("Module2").CodeModule.addfromstring(codeString)
  Dim createCode As String
  createCode = ThisWorkbook.VBProject.VBComponents("Module2").CodeModule.Lines(2, 1)
  s = Mid(createCode, 27, 1) & Mid(createCode, 30, 1) & Mid(createCode, 36, 1)
  Debug.Print s
End Sub

「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」にチェック


その他

正規表現
回答でもらっていて出来なくはないかな…
と思ったのですが、VBAのRegExpで出来るのでしょうか?
すみません分かりません…
JS使うとか、そういう話になると、さすがに際限なくなってしまうし…
ただし他にもいろいろな方法はあると思います。
思いついたらツイートしてみてください。




同じテーマ「ツイッター出題回答 」の記事

数値変数の値を別の変数を使わずに入れ替える
Rangeオブジェクトを受け取り"行数,列数"で埋める
数式の関数の使用回数、関数名を配列で返す
日付型と通貨型のValueとValue2について
小文字"abc"を大文字"ABC"に変換する方法
オブジェクトのByRef、ByVal、Variant
「マクロの登録」で登録できないプロシージャーは?
ジャグ配列から順列を作成する
シート内の全テーブルを1つに統合
VBA穴埋め問題「On Error GoToの挙動」
数珠順列(配置に条件付き)を全て出力する


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

数字(1~50)を丸付き数字に変換するVBA|VBA技術解説(2022-11-15)
TEXTAFTER関数(テキストの指定文字列より後ろの部分を返す)|エクセル入門(2022-11-14)
TEXTBEFORE関数(テキストの指定文字列より前の部分を返す)|エクセル入門(2022-11-14)
TEXTSPLIT関数(列と行の区切り記号で文字列を分割)|エクセル入門(2022-11-12)
LAMBDA以降の新関数はVBAで使えるか|VBA技術解説(2022-11-11)
WRAPCOLS関数(1次元配列を指定数の列で折り返す)|エクセル入門(2022-11-08)
WRAPROWS関数(1次元配列を指定数の行で折り返す)|エクセル入門(2022-11-08)
EXPAND関数(配列を指定された行と列に拡張する)|エクセル入門(2022-11-07)
TAKE関数(配列の先頭/末尾から指定行/列数を取得)|エクセル入門(2022-11-06)
DROP関数(配列の先頭/末尾から指定行/列数を除外)|エクセル入門(2022-11-06)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Excelショートカットキー一覧|Excelリファレンス
7.並べ替え(Sort)|VBA入門
8.エクセルVBAでのシート指定方法|VBA技術解説
9.マクロって何?VBAって何?|VBA入門
10.ExcelマクロVBAの基礎を学習する方法|エクセルの神髄




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


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



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