セルをコピーして貼り付け

Copyメソッドを使用して貼り付けまで実行するコードは2通りあります

'指定セルのコピーを直接貼り付けする
Range("A1").Copy Range("A2")
'選択セルをクリップボードにコピー
Selection.Copy
'B1を選択する(貼り付け先)
Range("A3:A6").Select
'コピーデータを貼り付ける
ActiveSheet.Paste
'コピーモードを終了する(点線が消える)
Application.CutCopyMode = False
セルのコピー貼り付けのコードの動き
セルのコピー貼り付けのコードの動き

セルのコピーと貼り付けには「Copy」を使用します

引数に貼り付け先のアドレスを指定することが出来ますので、ここを指定するとコピーと同時に貼り付けを行うことが出来ます
この引数は省略可能で、省略した場合はクリップボードにデータが貼り付けられます

なお、画像の動きではスクショを撮るためにクリップボードを使用しているせいで、コピー対象先の点線の枠線が表示されていませんが実際にコードを実行すると表示され最後に消えます

通常のコピペ操作は1つ目の1行で実行すればいいです、クリップボードも経由しないのでこちらのほうが処理が速くてコピーモードの操作も必要ないからです

2つ目のコードはマクロの記録の際に出てくるコードです
実際こちらのほうが、Excelの操作と同じ手順にコードを実行していくのでイメージがしやすく作りやすい可能性もありますので、あえてこちらを使うのもいいと思います、可読性は処理速度並みに重要です

省略した「Copy」メソッドを実行するとコピーモードに入ります、コピー部分が点線に囲まれる状態です

次にデータを貼り付ける先を選択状態にします、1つ目でも同じですがここで範囲選択をしておくと、その範囲すべてに貼り付けが実行されます

選択したセルからコピーしたデータを貼り付けます
コピーが終わったら、コピーモードを終了します(コピー状態の点枠線が消える)

このコピーはセルのコピーなので値だけでなく書式も含めてコピーされます
また数式の場合は、通常のコピー同様に引数がセルなら更新されます

なお、この「ActiveSheet.Paste」は、対象オブジェクトがRangeではなくSheetに対して行っています
これはセルのみではなく図形や画像などのオブジェクトに対しても行う貼り付けとなっているためです
なので、Rangeオブジェクトに対して貼り付けの操作は実行できません

最後の「Application.CutCopyMode = False」は無くても問題ありませんが、そのままだとセルをEnterキーで貼り付けされてしまうし、点線が残ったままなのも少し気持ち悪いです
なので、セルのコピーはここまでをセットに行います

セルにデータを入力

セルにデータを入力する基本的な処理のコード

'A1セルに100を入力
Range("A1").Value = 100
'アクティブセルに100を入力
ActiveCell = 100
'選択中のセル全てに100を入力
Selection = 100
セルにデータの入力の動き
入力コードの動き

セルにデータを入力するには、セル範囲のオブジェクトに対して代入します
基本的には「.Value」プロパティに値を代入します

ただ、「.Value」は省略可能なので2つ目以降は省略していますが値の代入は通常通り行えます。また入力データは文字列や日付データでも同じ方法で問題ありません

2つ目では、アクティブセルへの入力となります
このコードを使えばアクティブセルを移動させながら、データの入力を行っていくことができます

「Selection」は選択範囲のセル全てを対象にしますので、このコードで一括で選択範囲全てに同じ値を入力できます

一括入力のすすめ

今後VBAを使っていく上でも重要な話として、この一括入力があります

一括入力は例コードの3つ目のように1つのコードで複数の要素にデータを入力することです

この様に一括入力を行わなくてもループ処理ですべてのセルに入力させることはできます
ただ、その場合1つのセルに入力する処理をセルの個数分行う必要があります

そして処理速度に大きな影響を与えるのもこの入力処理になります

そこで重要なのがこの一括入力処理になります
これを行うと入力処理が単純にセルの入力個数倍数速くなるわけです
しかもいちいち入力内容の描画を行わないため、描画速度の面でも圧倒的に優位になるのでこの一括入力を意識的に行うようにしていってください

最終的な形は配列で一括入力です

Excelを非表示にする

Visibleプロパティを使用してExcelをタスクバーからも非表示にしてしまうコード

'Excelを非表示にする
Application.Visible = False
'Excelを表示する
Application.Visible = True

Excelを非表示にするには「Visible」プロパティの設定を変更します
「False」を指定すると非表示状態、「True」を設定すると表示状態になります

非表示にしたExcelはタスクバーからも表示が消えるため、再表示させるにはプロパティの設定を行う必要があります
VBE画面は表示していれば非表示にはならないので、コードのテストをする場合はVBEの画面を消さないようにしてください

これはバックグラウンド実行される状態になりますので、完全にユーザーからのアクセスを遮蔽できますし、ユーザーフォーム主体時にExcelの最小化では少し不安な部分(簡単に再表示できる状態)を解消できます

ですが、安易な使用はおすすめできません

なぜなら、処理が途中でエラーなどで停止した際、ユーザーが戸惑う事請け合いです

該当ブックを開けばExcelが自動的に再表示されるので、復帰は可能ではありますが・・・
この際に2重で開けない警告が表示されますので、わからずOKしてしまうと未保存の作業データが消失します

さらに、別のPCからやExcel再立ち上げからブックを開く際は別のユーザーが使用中となり編集不可の状態に陥ります

最小化よりも見えない分スマートですが、使用には注意が必要です
十分動作確認をして、もしもの復帰方法も確保した上で使用してください
そう、それが真のスマートです

Excelの表示モードを変更

最大化・最小化・標準のそれぞれの表示モードの切り替えと取得を行うコード

'Excelを最大化する
Application.WindowState = xlMaximized
'Excelを最小化する
Application.WindowState = xlMinimized
'Excelを標準サイズにする
Application.WindowState = xlNormal
'Excelの表示モードを取得
Debug.Print Application.WindowState

Excelの表示モードの変更と取得には「WindowState」を使用します
サイズの指定ではなく、表示状態の設定を変更します
なので例コードの3種類の設定を行えます
「最大化」・「最小化」・「標準」ですね

また当然ですが、Excelのウィンドウサイズを変更する場合はこのプロパティを「xlNormal」に設定しておく必要があります

主な使用方法としては、上記のサイズ変更の際とユーザーフォーム主体のプログラムを作ったときにエクセルを表示させないように最小化しておく時などに使用します

また、このプロパティを利用することで簡易的に画面のサイズを取得できます
それを応用してユーザーフォームのサイズを自動的に調整する方法があります
そちらの解説は以下の記事で行っています

イミディエイトウィンドウについて

デバッグ時に重要なイミディエイトウィンドウの解説と使い方

イミディエイトウィンドウとはVBEのウィンドウの1つです
表示タブか「Ctrl+Gキー」で表示されます
デバッグ用の画面です

イミディエイト画面でコード実行
イミディエイトウィンドウでコードを実行する

このウィンドウでは、1行の処理を実行する事が出来ます
「MsgBox “”」
この1行をイミディエイトウィンドウの空白行にコピーして、入力カーソルをその行に置いてEnterキーを押すと処理が実行され空白のメッセージが表示されます
処理作成中にちょっとしたテストをしたい場合に使用できます

プロパティ値の取得

イミディエイトでプロパティを取得する
プロパティの取得
?ThisWorkbook.Name

上記のコードのように、行の先頭に「?」を入力してから、取得したいプロパティを入力してEnterキーを押すと、改行後に指定したプロパティ値が出力されます
変数名を指定すると、現在の変数のデータが出力されます
こちらもちょっとしたプロパティ確認に使用できます

プロシージャからイミディエイト画面に出力する
プロシージャからイミディエイトに出力する
Debug.Print ThisWorkbook.Name

プロシージャの実行中にイミディエイトウィンドウに出力することもできます

上記のコードをプロシージャ内にコピーして実行してください
すると、イミディエイトウィンドウにブック名が出力されます

こちらはデータの数が多かったり、データの履歴を確認したい時に使用します
メッセージボックスだと数が多いとめんどくさいし、履歴も残らないので

1行で複数のコードを実行

イミディエイト画面で複数処理を実行する
複数の処理を実行する

イミディエイト上でのコード実行で応用として、コードの1行の終わりに「:」を入力して2行目のコードを連結すると一括で処理が実行できます

画像の動きのように、2つの処理が実行されています

この使い方自体は、プロシージャの通常処理でも使用可能です
ただそれはコードの可読性を落とす可能性が高いので、やめといたほうがいいと思います

「Else : EndIf」など実際の処理は何もないような時ぐらいで抑えておきましょう

イミディエイト画面は非常に便利な機能なので有効に活用してください

いろいろな事(暇なときにどうぞ)

ExcelVBAでの豆知識やこのサイトでのコードの扱いなど

値の入力(代入)と比較

ExcelVBAでは、値の入力(代入)と比較が似ています
値の入力は、Range(“A1”)=100
比較は、この条件式のままIfなどを使用すると比較になります

文字列の扱い方

関数でも同じなのですが、コード中に文字列を扱いたい場合は「”(ダブルクォーテーション)」で挟む必要があります
Shift+2キーで入力できる文字です、自動的に変換はされますが半角で入力します
「”文字列”」 こんな感じで使用します

また、文字列の結合は「&」を使用します
「”単価:” & 10 & “円”」 → 「単価:10円」となります

改行は「vbLf」を使用し、結合と組み合わせます
「”商品A” & vbLf & “単価:” & 10 & “円”」

「商品A
単価:10円」となります

改行には「vbCr」「vbCrLf」が他にもあります
どれもVBAで改行として使用できますが、セル内での改行は「vbLf」が使用されるのでそれに合わせておいたほうが、改行の検索する際に便利です
ちなみに、CrとLfはそれぞれ改行文字として1文字入っています
なので、置換や文字数のカウントでは注意が必要です

ワイルドカード文字

ワイルドカード文字とは、文字列の検証に使う特殊な文字の事です
Excelの検索や置換でも使用するものです
「?」は任意の1文字を表します
「*」は不特定の文字を表します


「VBAの部品庫」を検証する場合
「VBAの???」=○
「VBAの????」=×
「VBAの*」=○
「*VBA*」=○

これらの文字を扱うことで、完全一致ではないものを検索が可能となり
条件に一致するものをまとめて操作することが出来るようになります
FindメソッドやDir関数でこれらの文字を扱うことで、完全一致ではないものを検索が可能となり条件に一致するものをまとめて操作することが出来るようになります

日付データの入力

日付データは文字列や数値とは違う入力ができます(実際の日付データの中身は数値なので数値としての入力も問題ありません)
「#m/d/yyyy#」の形式で入力すると、日付として扱えます
「#1/31/2000#」 こんな感じで使用します
また、時刻まで指定する場合は「#m/d/yyyy h:m:s#」というように西暦年の後にスペースを置いてから時分秒を「:」で区切り入力します
「#1/31/2000 20:13:25#」 こんな感じで使用します

条件式の等符号

Ifで条件式を使う際に必要なのが等符号です
ExcelVBAは代入と比較が同じ「=」を使うので、混乱しないようにしましょう

A=B → AとBは同じ
A<>B → AとBは同じではない

A>B → AはBよりも大きい
A<B → AはBよりも小さい

A>=B → AはB以上
A<=B → AはB以下

文字列の比較は「Like」を使用、ワイルドカード文字も使用できます
A Like “*あ*“ → Aは文字列「あ」を含む
オブジェクトの比較は「Is」を使用
A Is Nothing → オブジェクトAは「Nothing」である(オブジェクトの初期値)

処理の停止

無限ループや処理時間が長く一時処理を停止したい場合は「Escキー」もしくは「Ctrlキー+Breakキー」を押下します
1回では止まらない事もあります、あきらめず押しましょう

Selectionについて

当サイトでは、1行のステートメントでコピペして作るという想定のもと構成していることからセル範囲のオブジェクト指定には「Selection」を使用しています
ただ、このSelectionというのは実際にはワークシート上にあるオブジェクトが対象となっています
つまり、セルだけでなく図形等も含むオブジェクトがSelectionの対象になっています
なのでセルのプロパティやメソッドを、他のオブジェクトで実行するとエラーが発生する恐れがあります
Selectionはこのコード実行前に必ずオブジェクトの指定を行っているはずなので問題は出にくいかもしれませんが、意識として「Selection=選択中のセル」とはならないということを持っておいてください

パスの¥マークとバックスラッシュについて

絶対パスなどで使用するフォルダ内を表す文字「\」について
この画面ではどう見えていますか?
Web上では「バックスラッシュ」という記号になっていることが多いと思います
ですが、エクスプローラーでは「半角の¥マーク」です
なので当然VBAコード上も後者です
これは文字コードが全く同じなので、どちらに見えていても動きには全く問題ないので安心してください
「コピペしたら¥マークになった」これは正常です

引数の入力方法

引数の入力には2通りの方法があります
引数の名称を指定して入力する方法と名称を省略して入力する方法です
例えば、MsgBox関数でいうと

引数の名称指定あり → MsgBox Title:=”タイトル”, Prompt:=”本文”
引数の名称指定省略 → MsgBox “本文”, , “タイトル”

こんな形の指定方法になります
実行時は全く同じ結果が表示されます
引数はインテリセンス入力ができないので、入力はめんどうです
なのでほとんどの場合は後者の省略したほうを使用することが多いです
ただ、当然引数を知らなければ意味不明です
引数の数が多く、途中で改行でもすればさらに分かりにくくなります
とはいえ知らずに作成するのも不可能なので、作成できる時点で知っているはずです
なのに省略をしない方法の利点は、順番を入れ替えれる点と指定外は非入力で良い点かと思います
省略法の場合は、引数の順番は固定で省略時は「,」だけ入力する必要があります
省略しない方法は、順番も好きなように入れ替えれるので分かりやすくなる可能性もあります
先にタイトルがあって、本文がある流れの方が分かりやすければ前者が有用です
このサイトでもどちらかに固定はしていません、引数の必要なコードで臨機応変に使い分ければいいかなと思います
(引数が多く、コピペするひとがわかりにくくなりそうなときは非省略法で解説してます)

日本語の使用について

VBAでは文字コードがUnicode形式となっています
これは1つの文字に対して、2バイトで表現する形式です
半角の文字列であっても2バイトで表現されます
このおかげでVBAでは日本語の変数も使用できますし、日本語に連番で「1」などの半角文字と混在させてもプログラムに支障が無いようになっています
アルファベット圏では無い日本人にはありがたい形式ですね
色々とWeb上でも賛否両論ある日本語使用でありますが、自分としては使用することをおすすめします
主な利点として「コメントが必要ない程分かり易くなる・コード中に出てきたらいきなり日本語なので変数と分かり易い」辺りかなと思います
あと感情的な理由ですが、Microsoftのプログラマーさん達がわざわざ日本語などの母国語文字を使えるように仕様を作ってくれているのです
自分でもそうですが、せっかく作った仕様は使い尽くして欲しいと感じますしね

配列変数の下限値について

配列変数の下限値は通常「0」から始まります
ですが「Option Base」や「( 3 To 5)」などの使い方によって変動してきます
なので、下限値が「0」ではない可能性はあります
ただそれには上記の特別な使い方をした場合に限られます
配列というメモリ上のデータの連番の始点を可変にすることもあまりおすすめできません
なので、このサイトでは下限値は「0」であるという想定の下解説を行いますし
上記の下限値を変更するコードを記事にもしません

知っておくといい用語

ExcelVBAに出てくる用語説明(知ってなくても処理は作れる)

基本的な用語(知ってなくても処理は作れるけど解説が分からなくなる)

ブック
Excelファイル自体のこと、VBAはこれの要素の1つ

プロジェクト
ブックと同義、ブック1つにプロジェクトも1つ。これの下にモジュールがある

モジュール
標準・クラス・オブジェクト(ユーザーフォーム含む)がある

標準モジュール
通常処理作成はここに作成を行う、何個でも作成可能

クラスモジュール
クラス定義を行う、主にはコードの質向上に使う。

オブジェクトモジュール
オブジェクトとは物のことなので、ブック・シート・ユーザーフォームがある

ブック・シートモジュール
ブックモジュールはプロジェクト1つにつき1つ、シートモジュールは作成されたシートの数だけ自動的に作成される

ユーザーフォームモジュール
ユーザーフォームという各コントロールを使用してExcelとは別のウィンドウを作成する、システム作成まですると必須

プロシージャ
処理、これを作るのが仕事です。これが上記のモジュールのどこかに入ってプログラムとして実行されます。モジュール内に何個でも作れますが、ほどほどにしないとどこに何があるか分からなくなります

オブジェクト
前後しますが、セルやシート、図形やフォームのコントロール達。省略可能な場合が多く気づきにくいが、コードのほとんどはこのオブジェクトに対して処理を行っています

コレクション
オブジェクトやデータの集合体、まとめて処理を行ったりループ処理に使用することが多い

プロパティ
オブジェクトの情報です。セルの入力内容や書式設定も全てこれです。これに対して設定を変更したり、情報を取得して処理を行ったりします

メソッド
オブジェクトの動きです。セルのコピペやシートの作成削除がこれです。処理のほとんどが、このメソッドとプロパティの組み合わせで行っています

イベント
オブジェクトに備わっているもの。セル内容を変更・コマンドボタンをクリックなどユーザーが無意識に行う操作で発動するもの。ここにプロシージャを作って無意識下で処理の実行を行うことが可能になる

変数
特定のデータに名前を付けたもの。付けた名前は変わらなくてもデータは変わることの出来るもの

関数・引数
関数とはすでに作成された処理のことです。
VBAでも作成可能ですがそちらはユーザー定義関数と記載するので、関数と記載していた場合はVBA標準関数の事です
その関数が必要とする要素を引数(ひきすう)といいます
省略可能な場合が多いですが、最低1つはほとんどの関数は引数が必要です

定数(じょうすう)
数値を文字列に置き換えたもの。基本的にプロパティの設定値などは内部的には数値で扱われています
しかし、プロパティごとに0がなにで、1がなにで、-1はこう、といちいち覚えてもいられませんし、見直しても分かりにくいことこの上ありません
例えば、色に関していうとわかりやすいです
「65280」この色です。といわれても何色か分かりません
そこで、この数値を定数に置き換えたものが「vbGreen」です
緑色だ、と分かったはずです
これが定数の便利さです、これのお陰で値をいちいち覚えていなくてもプログラムが書けます
こちらもユーザー定義の定数は変数の部類になるので別と思っていてください

参照設定
外部アプリなどを使用する際にExcelVBAにそのアプリを使用可能な状態に設定すること
事前バインディングと実行時バインディングの2通りの方法がある

事前バインディング
VBAの参照設定でコーディング中に設定を行うこと
メリットは、そのコードに対するインテリセンスが可能になることやプロパティやメソッドが確認できることと処理実行前に設定が完了しているため実行時バインディングより動作が早い

実行時バインディング
処理の実行中に参照設定を行うこと
メリットとしては、事前の参照設定を行っていなくても実行可能になること
例えば、参照設定を行っていないPCで作成した処理を実行するとエラーになるが実行時バインディングであればエラーにならず実行可能になる
またバージョン違いに関しても柔軟に対応できる
実行環境を整える必要がない分、こちらの方がメリットが大きいと思います

リファレンス
VBAのヘルプサイトのこと。以前はOfficeソフトに同梱されていたヘルプがネット上に開設されたところ。もちろんOffice持ってなくても閲覧可能です
自動翻訳なので、ん?や定数が日本語化されてて、あかん!ってなりますが、下手な解説サイトよりよっぽど役に立つよ!と身も蓋もない事をあえて言っておきます

ExcelVBAのリファレンスページへのリンク
https://docs.microsoft.com/ja-jp/office/vba/api/overview/excel

ユーザーフォームを解像度に合わせてサイズ調整

UserFormのサイズを解像度に合わせてサイズと表示倍率を自動的に調整する処理

'Excelを最大化して、そのサイズに合わせてフォームの大きさも変更
Application.WindowState = xlMaximized
Const 高さ割合 As Double = 0.8
Me.Zoom = Me.Zoom * ((Application.Height * 高さ割合) / Me.Height)
Me.Width = Me.Width * ((Application.Height * 高さ割合) / Me.Height)
Me.Height = Me.Height * ((Application.Height * 高さ割合) / Me.Height)

↑Initializeイベント内に貼り付け

Private Sub UserForm_Initialize()

'Excelを最大化して、そのサイズに合わせてフォームの大きさも変更
Application.WindowState = xlMaximized
Const 高さ割合 As Double = 0.8
Me.Zoom = Me.Zoom * ((Application.Height * 高さ割合) / Me.Height)
Me.Width = Me.Width * ((Application.Height * 高さ割合) / Me.Height)
Me.Height = Me.Height * ((Application.Height * 高さ割合) / Me.Height)

End Sub

↑イベント未作成時の場合、モジュール内に貼り付け

ユーザーフォームと解像度

ユーザーフォームをある程度作成するようになって時間が経ってくると、気づくことがあります
それが、PC画面の解像度の違いによってフォームがちっちゃなってしまうことです

逆に、解像度の高いPCで作ったフォームが低いPCではみ出してしまったり妙にでかくて不格好になってしまうこともあります

この状況に対応するには、フォームの大きさを解像度に合わせて変更してあげる必要があります

以前考えていた方法は、作成したフォームの大きさを元に調整していましたがその方法だとコード上にその数値を入力する必要もあり、ワイド画面かどうかでも修正が必要だったのですこし面倒でした

そこで今回考えたのが、今回の例コードです
これはExcelの高さを元に計算するので、ワイド画面かどうかの判断は必要なくなりました

ただ、一つどうしようもないのは文字のはみ出しのZoomプロパティの調整関係ですが、これはこのプロパティで調整する以上はあきらめるしかありません
これの完璧な調整はコマンドそれぞれに大きさの調整を行っていく必要があります

コードで自動サイズ調整

作成したときの解像度のフォームの大きさ
【800×600】作成したフォームの大きさ

今では少し懐かしいサイズの解像度の【800×600】の画像です
当初このサイズ感で作成したので、同じ解像度ではなんの問題もありませんでした

解像度が上がったときのフォームの大きさ
【1360×768】で表示したときの大きさ

しかし、解像度の上昇により同じサイズであった場合画像のように小さくなってしまいます
Excelとの大きさを比較してもらうと分かり易いと思いますが、これでは文字が見えづらく、みんなPC画面をにらみつけるようになってしまいます

フォームの見栄えも、みんなの印象も悪くなる前に何とかしたほうが良さそうなので例コードを使用してみます

解像度が上がったときの処理後の大きさ
【1360×768】でコードを実行した時

この画像がコードを実行してサイズが自動調整された大きさです
実行前の画像と比べてみるとサイズがかなり大きくなっているのが分かると思います

こちらのコードは、Excelのサイズに自動調整されるので作成時の大きさはほぼ意味がなくなります

作成したときの解像度の処理の動き
【800×600】でコードを実行した時

これは、作成時の解像度でのコード実行時の動きです
この様に作成したときの解像度であってもサイズが自動調整されます

コードの解説

Application.WindowState = xlMaximized

これは、Excelウィンドウのサイズを最大化に設定します
Excelウィンドウサイズの高さで調整するので、これが無いと画面の大きさに等しくならないのでここで設定を入れておきます

もし、最大化することがはばかられる場合は事前にサイズの設定を取得しておき高さを取得してから戻せばいいです

WinAPIを使えば解像度の取得は出来るので、ここは必要なくなりますがこの1行で準備できるなら楽ですよね

Const 高さ割合 As Double = 0.8

ここでExcelウィンドウの高さに対するフォームの高さを定数で指定します

この「0.8」が割合の数値ですので、Excelの高さの80%という意味になります

ここの数値を任意に変更してください、この設定値次第ではZoomプロパティでエラーが発生する可能性があるのでその際は調整してください
Double型なので、もっと細かい数値設定は可能ですが「1」を超えないようにしてください、画面からはみだしますね

Me.Zoom = Me.Zoom * ((Application.Height * 高さ割合) / Me.Height)

ここからフォームの表示設定を行っています

ここのオブジェクト名「Me」とは、このコードの記載されたユーザーフォームが指定されるもので、ActiveCellのような感じの使い方です

ここでは「Zoom」プロパティの設定を変更しています、プロパティの設定は以下の記事を確認してください

Excelウィンドウのの高さに定数「高さ割合」を積算します
ここでは「0.8」を積算する形になります
その高さとフォームの高さを除算して割合を出します

この時、画像の例とは逆にフォームがExcel本体より大きすぎた場合は、100%未満になってフォームのサイズが小さくなります

Me.Width = Me.Width * ((Application.Height * 高さ割合) / Me.Height)

次にフォームの横幅を調整します
Zoomプロパティと同じように計算を行います

なお、高さを元に調整しているのでZoomとWidthは入れ替わっても問題ありませんが、最後にHeightは調整するようにしてください

Me.Height = Me.Height * ((Application.Height * 高さ割合) / Me.Height)

最後に高さの調整です
計算自体は全て同じですが、ここで計算式に入っているHeightプロパティに代入するのでこれ以降は同じ計算は行えません

またコードを見て分かるように、割合の計算式は3行とも同じものなので変数や定数を使用して割合数値を代入して計算させてもいいです
例コードではコピペ行数を減らすために使用していません

最後にこのコードはユーザーフォームの「Initialize」イベント内に作成してください、起動してから変更する場合は位置調整が必要になる場合があるので面倒です
また、UserFormの「StartUpPosition」には画面の中央に設定をしておくと変更後のサイズで自動的に中央に配置してくれます

別のサイズ調整方法として

'Excelを最大化して、そのサイズに合わせてフォームの大きさも変更
Application.WindowState = xlMaximized
Me.Zoom = Me.Zoom * (Application.Height / Me.Tag)
Me.Width = Me.Width * (Application.Height / Me.Tag)
Me.Height = Me.Height * (Application.Height / Me.Tag)
Private Sub UserForm_Initialize()

'Excelを最大化して、そのサイズに合わせてフォームの大きさも変更
Application.WindowState = xlMaximized
Me.Zoom = Me.Zoom * (Application.Height / Me.Tag)
Me.Width = Me.Width * (Application.Height / Me.Tag)
Me.Height = Me.Height * (Application.Height / Me.Tag)

End Sub

↑イベント未作成時の場合

別の調整方法として作成時のExcelの高さを保存しておきその数値で新しい環境と比較して自動調整する方法です

こちらは1つ目の方法と違って、作成時の環境の高さの数値を保存しておく必要があるため少し面倒なので少しだけ紹介しておきます
1つ目と違うのは割合の計算式の部分だけなのでそれ以外のコードは1つ目のコードを参照してください

Me.Zoom = Me.Zoom * (Application.Height / Me.Tag)
赤字の部分だけ違っていますが、これはExcelの高さをユーザーフォームのTagプロパティに保存された数値で除算して割合を出しています
このTagプロパティに保存する数値は作成したPC環境でのExcelの高さの数値を入力しておきます

Debug.Print Application.Height

このコードでExcelの高さをイミディエイトに出力できますので、この数値をTagプロパティに入力してください
この数値を基準に割合計算を行います

こちらの方法であれば、作成したときの大きさと同じ解像度の場合にサイズの自動調整が行われないので1つ目の方法で現在の使用環境でうまく文字が収まらないのでどうしようも無い時に使えますが、やはりTagに入力するのと占有されるのが難点ではあります
ですが、もともとこのサイズ調整は解像度がもし違う場合に、その環境に合わせておきたいレベルの話が多いので全くの無駄とは言えません

配列変数に一括代入(Array関数)

Array関数は配列を作成する関数です。これを利用して配列変数に一括代入する方法

'Array関数を使用して、配列を一括代入する
Dim 動的配列() As Variant
動的配列 = Array(1, 2, "あ", "か", ActiveCell)

配列変数は同じ役割の変数を複数使用するために使いますが、代入する際に大量にある要素を1つずつ代入するのももったいない場合があります

そんな場合に一括で代入する方法として「Array」関数を使用します
Array関数は、配列を作成して返す関数です
ただし、この方法を使用する場合は動的配列であり、なおかつ型をvariant型で宣言する必要があります

この記事では配列を手動作成するような形ですが、セル範囲のデータを一括で代入させたい場合は以下の記事を確認してください

実際のコードの動き

Array関数で配列一括代入する動き
配列変数への一括代入の動き

関数で配列を作成し、それを一括で代入します
また使用することは無さそうですが、画像の様にvariant型なので型の違うデータやオブジェクト型もまとめて代入させることもできます

要素0と1はInteger型、2と3はString型、4はRange型となっています

なお、Array関数での代入に関しては要素数宣言が必要ありません
画像の様にRedimを使用していないのに、要素数が自動的に追加されて代入されます、便利っすねぇ

配列変数の初期化

要素数が複数ある配列変数を一括で初期化するコード

'配列変数を初期化する
Erase 配列変数

配列変数を初期化するには「Erase」を使用します

配列変数名のみ指定しますので、「()」や要素数の指定は必要ありません

配列変数の初期化の動き
配列変数初期化の動き

このコードを使用すると、配列の宣言時点に戻ります
なので、静的配列はそのまま宣言時の要素数を使用できます
しかし、動的配列は要素未定状態に戻ってしまうので、そのまま再利用することが出来ませんので「Redim」による要素数宣言が必要です
(動的配列の要素数宣言方法はこちら)

なお、Object型は「Nothing」に戻してくれるので、Object型のメモリ解放を個別に行う必要はありません