小文字"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 ・・・新着記事一覧を見る
シート関数のCOUNTIFS,SUMIFS,MAXIFSと同じ処理|Power Query(M言語)入門(2023-02-28)
新旧マスタの差異比較|Power Query(M言語)入門(2023-02-28)
有効な最新単価の取得|Power Query(M言語)入門(2023-02-26)
有効な最新単価の取得|Power Query(M言語)入門(2023-02-21)
グルーブ内の最小・最大|Power Query(M言語)入門(2023-02-17)
2つのテーブルのマージ|Power Query(M言語)入門(2023-02-15)
「売上」が数値の行のみ取り込む|Power Query(M言語)入門(2023-02-13)
A列のヘッダー名を変更する|Power Query(M言語)入門(2023-02-11)
CSVのA列が日付の行だけを取り込む|Power Query(M言語)入門(2023-02-10)
列数不定のCSVの取り込み|Power Query(M言語)入門(2023-02-09)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.マクロって何?VBAって何?|VBA入門
7.並べ替え(Sort)|VBA入門
8.エクセルVBAでのシート指定方法|VBA技術解説
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。