エクセル雑感
小文字"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使うとか、そういう話になると、さすがに際限なくなってしまうし…
ただし他にもいろいろな方法はあると思います。
思いついたらツイートしてみてください。




同じテーマ「エクセル雑感」の記事

配列のUBoundがLBoundがより小さいことはあり得るか
ショートカット(Ctrl+Shift+n)抜け番ばどれだ
コレクションの要素を削除する場合
入力規則で○△を入れる数を制限する方法
greeenはgreenに、greeeeeNをGReeeeNに変換
数値変数の値を別の変数を使わずに入れ替える
Rangeオブジェクトを受け取り"行数,列数"で埋める
数式の関数の使用回数、関数名を配列で返す
キーボード操作だけで非表示列を表示
日付型と通貨型のValueとValue2について
小文字"abc"を大文字"ABC"に変換する方法


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

ピッボットテーブルって便利だよね|還暦のVBA(2021-10-18)
還暦のVBA:VBAまでたどりつけるか… (2021-09-29)
VLOOKUPを使うことを基本としてシートを設計すべきか|エクセル雑感(2021-08-17)
コンピューターはブラックボックスで良い|エクセル雑感(2021-08-14)
小文字"abc"を大文字"ABC"に変換する方法|エクセル雑感(2021-08-13)
ADOでテキストデータを集計する|VBAサンプル集(2021-08-04)
VBA学習のお勧めコース|エクセル雑感(2021-08-01)
エクセル馬名ダービー|エクセル雑感(2021-07-21)
在庫を減らせ!毎日棚卸ししろ!|エクセル雑感(2021-07-05)
日付型と通貨型のValueとValue2について|エクセル雑感(2021-06-26)


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

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




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


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



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