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

ExcelマクロVBAとエクセル関数についての私的雑感
公開日:2021-08-13 最終更新日: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 ・・・新着記事一覧を見る

SQL基礎問題9:特定商品購入者の平均購入金額|SQL入門(2025-11-04)
SQL基礎問題8:バスケット分析・ペア商品の出現回数|SQL入門(2025-11-04)
SQL基礎問題7:成績表から各教科の最高点と最低点を抽出|SQL入門(2025-11-02)
SQL基礎問題6:成績表から教科ごとの点数ベスト3を抽出|SQL入門(2025-11-02)
SQL基礎問題5:複数のマスタテーブルの結合|SQL入門(2025-11-01)
SQL基礎問題4:2つのテーブルの不一致を抽出|SQL入門(2025-10-29)
SQL基礎問題3:文字列の一部をキーにして集計|SQL入門(2025-10-29)
SQL基礎問題2:文字列「-nn-」のnnが偶数のみ抽出|SQL入門(2025-10-28)
SQL基礎問題1:最大在庫数を持つ製品の在庫金額|SQL入門(2025-10-28)
「ADO + VBA」でSQLを実行するときのVBAサンプル|SQL入門(2025-10-28)


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

1.生成AIパスポート試験 練習問題(四肢択一式)|生成AI活用研究
2.最終行の取得(End,Rows.Count)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.RangeとCellsの使い方|VBA入門
7.FILTER関数(範囲をフィルター処理)|エクセル入門
8.日本の祝日一覧|Excelリファレンス
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.セルのクリア(Clear,ClearContents)|VBA入門




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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