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

https://twitter.com/yamaoka_ss/status/1425799283303882758
小文字"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"に変換出来れば良いです。
他の文字が云々とか考える必要もないです。
純粋に手法をどれだけ知っているかを問う問題です。
回答ツイート
解答ツイート

https://twitter.com/yamaoka_ss/status/1426077413880958980
私の想定した方法は大きく分類すると、
✅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
私の環境で大文字になりませんが・・・

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 ・・・新着記事一覧を見る
第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方
|生成AI活用研究(2025-05-20)
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する!
|生成AI活用研究(2025-05-20)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック|生成AI活用研究(2025-05-19)
第2章 VBAって怖くない!Excelを「言葉で動かす」(超入門)|生成AI活用研究(2025-05-18)
第1章:AIって一体何?あなたのExcel作業をどう変える?(AI超基本)|生成AI活用研究(2025-05-18)
AI時代のExcel革命:AI×VBAで“書かない自動化”超入門|生成AI活用研究(2025-05-17)
Geminiと100本ノック 23本目:シート構成の一致確認|生成AI活用研究(5月16日)
AIが問う出版の未来は淘汰か進化か:AIと書籍の共存の道とは|生成AI活用研究(2025-05-16)
Geminiと100本ノック 22本目:FizzBuzz発展問題|生成AI活用研究(5月15日)
すぐに使える!生成AI プロンプト作成 実践ガイド|生成AI活用研究(2025-05-15)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.ひらがな⇔カタカナの変換|エクセル基本操作
6.RangeとCellsの使い方|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.FILTER関数(範囲をフィルター処理)|エクセル入門
10.条件分岐(Select Case)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。