かっきぃーの雑記帳

おもしろき こともなき世に おもしろく

複数選択が可能な チェックボックス(CheckBox)(その2)[とりあえず使えるエクセルユーザーフォーム超入門]

Lesson4 使えるようになっておきたい基本機能

もうちょっと使える表現にしてみる

その1ではチェックボックスの基本的な使い方を紹介しました。ここでは、もう少し実用的な体裁にする方法について紹介します。「マンゴーを選んだかどうか」を"True" か "False" ではなく、

 ”マンゴーを選びました。”
 ”マンゴーを選びませんでした。”

と表示してみます。ここでは、If文を使って CheckBox1.Value が "True" か "False" のどちらかを確認し、それに応じて、適切な文章を表示させる事例にて説明します。

If文については「エクセルVBAマクロ超入門」でも説明しています。

Private Sub CommandButton1_Click()
   If CheckBox1.Value = "True" Then
   ‘ CheckBox1.Value = "True" の場合の処理
   MsgBox "マンゴーを選びました。"
   Else
   ‘ CheckBox1.Value = "True" 以外の場合の処理
   MsgBox "マンゴーを選びませんでした。"
   End If
   End
End Sub

f:id:k_create:20200623093543p:plain

スポンサーリンク

 

 

さらに選択肢を増やしてみる

まずはフォーム上にチェックボックスを増やして合計4つにします。これに合わせて、選択肢も割り当てます。

f:id:k_create:20200623093757p:plain

Private Sub UserForm_Initialize()
   CheckBox1.Caption = "マンゴーを選ぶ"
   CheckBox2.Caption = "りんごを選ぶ"
   CheckBox3.Caption = "梨を選ぶ"
   CheckBox4.Caption = "柿を選ぶ
End Sub

コマンドボタンをクリックしたら、選んだ果物を表示させたいのですが、ここでは「●と●を選びました。」という複数表示を目指します。

先ほど紹介したMsgBox構文は一度に1種類の文章しか表示できません。選んだ果物の組み合わせを表示するには、いったん選択した情報を集めて、それを文章化し、その文章をMsgBox構文で表示するといった順に処理を進めます。

Private Sub CommandButton1_Click()
   If CheckBox1.Value = "True" Then cb01 = "マンゴー"
   If CheckBox2.Value = "True" Then cb02 = "りんご"
   If CheckBox3.Value = "True" Then cb03 = "梨"
   If CheckBox4.Value = "True" Then cb04 = "柿"
   cb_text = cb01 & "と" & cb02 & "と" & cb03 & "と" & cb04 & "を選びました。"
   MsgBox cb_text
   End
End Sub

いったんcb01、cb02、cb03、cb04という変数に文字列を割り当てて、その文字列をつなげて一つの文章(cb_text)にし、それをmsgbox構文で表示します。

文字列の足し算は & で表記します!

f:id:k_create:20200623094511p:plain

おー、うまく表記されましたね。では、りんごと柿を選んでみましょう。すると、、

f:id:k_create:20200623094550p:plain

「と」が多い!

「と」の有無も制御する必要がありそうです。「と」をcb01~cb04の文字列に組み込むのがシンプルで速いですが、できれば最後の果物には「と」をつけたくないですね。

いろいろな工夫があると思いますが、私は次のようにコードを作り変えました。

Private Sub CommandButton1_Click()
   If CheckBox1.Value = "True" Then cb01 = "マンゴー"
   If CheckBox2.Value = "True" Then cb02 = "りんご"
   If CheckBox3.Value = "True" Then cb03 = "梨"
   If CheckBox4.Value = "True" Then cb04 = "柿"
   cb_text01 = cb01 & cb02 & cb03 & cb04
   cb_text01 = Left(cb_text01, Len(cb_text01) - 1)  'お尻の「と」を削除
   cb_text02 = "を選びました。"
   MsgBox cb_text01 & cb_text02
   End
   End Sub

cb_text01 = Left(cb_text01, Len(cb_text01) - 1) は文字列cb_text01の左側からLen(cb_text01) – 1 の文字数だけ抽出しろ、という命令です。Len(cb_text01) はcb_text01 の文字列の数を表しますので、その一つ減じた値、すなわち最後の「と」を除いた数だけ抽出しろ、という命令になるわけです。

いったんcb01~cb04のすべての果物に「と」をつけておいて、ひとつの文章にしておいてから、最後の「と」だけを消す、という方法ですね。

みなさんはどんな方法で対処しますか?

あとは、忘れずに、どれも選択しなかったケースも想定した処理をしておきましょう。

これ、忘れがちだけど重要!

Private Sub CommandButton1_Click()
   If CheckBox1.Value = "True" Then cb01 = "マンゴーと"
   If CheckBox2.Value = "True" Then cb02 = "りんごと"
   If CheckBox3.Value = "True" Then cb03 = "梨と"
   If CheckBox4.Value = "True" Then cb04 = "柿と"
   cb_text01 = cb01 & cb02 & cb03 & cb04
   If cb_text01 = "" Then
   MsgBox "どれも選んでいません。"
   End
   End If

   cb_text01 = Left(cb_text01, Len(cb_text01) - 1)  'お尻の「と」を削除
   cb_text02 = "を選びました。"
   MsgBox cb_text01 & cb_text02
   End
End Sub

f:id:k_create:20200623190930p:plain

 

よし!これでオッケー。

スポンサーリンク

選べるのはひとつ!オプションボタン(OptionButton)(その1)

                  10   11   12   13   14

とりあえず使えるエクセルユーザーフォーム超入門(もくじ)

 

スポンサーリンク

 


#エクセル #Excel #ユーザーフォーム #マクロ #VBA

複数選択が可能な チェックボックス(CheckBox)(その1)[とりあえず使えるエクセルユーザーフォーム超入門]

チェックボックスの配置

チェックボックス(CheckBox)は、□にレ点を入れることによって選択する機能であり、複数同時にチェックすることも可能となります。

ツールボックスで「チェックボックス」を選択し、フォーム上の始点でクリックし、終点までドラッグすることで、チェックボックスの枠組みを作成します。

f:id:k_create:20200617193203p:plain

 

初期設定1:チェックボックスの見出し

チェックボックスの見出しの設定方法には「プロパティ値(Caption)で修正」、「VBAコードで設定」といった主に2種類があります。

スポンサーリンク

 

 

プロパティ値(Caption)で修正

対象となるチェックボックスを選択した際に、画面左側にプロパティ値の一覧が確認できます。この中のCaption値がチェックボックスの見出しとなります。したがって、直接該当するテキストを修正すれば反映されます。

f:id:k_create:20200617193543p:plain

 

VBAコードで設定

VBAコードで設定する方法もあります。これもまた「3-1.ユーザーフォームの初期化(Initialize)」で紹介した方法です。具体的な方法は次の通り。この方法であれば、条件により異なる見出しを記載することにも応用できます。

Private Sub UserForm_Initialize()
   CheckBox1.Caption = "マンゴーを選ぶ"
   ' ↑
   '(オブジェクト名). Caption=”(記載したい文章)”

End Sub

 

初期設定2:チェックボックスの初期値

フォームを表示したときにあらかじめチェックを入れておきたい場合の具体的な方法は次の通り。

Private Sub UserForm_Initialize()
   CheckBox1.Caption = "マンゴーを選ぶ"
   CheckBox1.Value = "True"
   ' ↑
   '(オブジェクト名). Value="True"(チェックあり)
   ' または "False"(チェックなし)

End Sub

 

チェックボックスの選択情報の取得

チェックボックスにチェックが入っているかどうかの情報は CheckBox1.Value が"True"か "False" で確認できます。

フォーム右下のコマンドボタンを押したときに、チェックが入っているかどうかをMsgBox関数というダイアログボックスにメッセージを表示する機能を使用して確認してみましょう。

Private Sub CommandButton1_Click() コマンドボタン1をクリックした後の処理
   MsgBox CheckBox1.Value ‘ CheckBox1.Value の値を表示
   End '処理終了
End Sub

 

処理をした際に表示される画面は下記のとおり。

f:id:k_create:20200617200036p:plain

 

マンゴーを選んだので、”True” と表示されました。

ただ、"True" か "False" と表示させるだけでは実用的ではありません。次回は、実用的な表現にする方法について紹介します。

スポンサーリンク

複数選択が可能な チェックボックス(CheckBox)(その2)

                  10   11   12   13   14

とりあえず使えるエクセルユーザーフォーム超入門(もくじ)

 

スポンサーリンク

 


#エクセル #Excel #ユーザーフォーム #マクロ #VBA

選択肢リストを配置する コンボボックス(ComboBox)[とりあえず使えるエクセルユーザーフォーム超入門]

Lesson4 使えるようになっておきたい基本機能

コンボボックスの配置

コンボボックス(ComboBox)を使うことで、あらかじめ設定した選択肢を選ぶことが可能となります。選択肢を設定することで、ユーザーの入力作業が簡単になることはもちろん、人によって異なる表現のバラつきをなくすことができ、その後の統計処理などに威力を発揮します。

ツールボックスで「コンボボックス」を選択し、フォーム上の始点でクリックし、そのまま終点までドラッグすることで、コンボボックスの枠組みを作成します。

f:id:k_create:20200617085304p:plain

スポンサーリンク

 

 

選択肢リストの反映

次に選択リストを設定します。「3-1.ユーザーフォームの初期化(Initialize)」で紹介した方法をベースに設定することができます。コンボボックスの具体的な方法は次の通り。通常選択肢は複数あるので、With文の「.AddItem "(名称)"」で設定します。

Private Sub UserForm_Initialize()
   With ComboBox1 '(オブジェクトの指定)
     .AddItem "焼き飯"
     .AddItem "焼きそば"
     .AddItem "お好み焼き"
     .AddItem "たこ焼き"
   End With
End Sub

 

f:id:k_create:20200617085506p:plain

そうそう。これこれ、これがやりたかった!

 

もう一つの方法があります。それはExcelのSheetに記載の列情報を読み込むやり方です。そのときはWith文の「.RowSource = "(指定の列)"」で設定します。

Private Sub UserForm_Initialize()
   With ComboBox1 '(オブジェクトの指定)
     .RowSource = "Sheet1!A1:A6"
   End With
End Sub

 

これでコンボボックスでの選択が完了ですが、その選択した値を確認するためにはもう一つ仕込みが必要です。

 

コンボボックスの選択情報の取得

ユーザーフォーム上で選択が完了すると、ComboBox1.Value にその選択肢が格納されます。確認のために、Msgbox構文で表示させるコードは下記の通り。

Private Sub ComboBox1_Click() ' ComboBox1選択後に始まる処理
   MsgBox ComboBox1.Value ' CheckBox1.Value の値を表示
   End ' 処理終了
End Sub

f:id:k_create:20200617090529p:plain

コンボボックスの便利設定

自由入力をさせない(入力規制)

初期の設定だとコンボボックスに直接入力することで選択肢以外を入力することができますが、設定を変えることで選択肢以外は選べないようにすることができます。With文に「.Style = fmStyleDropDownList」を追加します。

Private Sub UserForm_Initialize()
   With ComboBox1 ‘(オブジェクトの指定)
     .RowSource = "Sheet1!A1:A6"
     .Style = fmStyleDropDownList ‘ 選択肢以外は入力規制
   End With
End Sub

フォームの表示と同時に初期値を表示

通常、フォームの初期値は空白でどれも選択されていませんが、with文の「.Value」を使用することで、フォームの表示と同時に初期値が入力されている状態にできます。Range文を使ってセルを指定してもよし、”(ダブルクオーテーション)で挟んだ文字列を入れてもよしです。「.Style」で選択肢の制限をした場合、初期値に選択肢外のものが入力できません(空白のままとなります)。

Private Sub UserForm_Initialize()
   With ComboBox1 ‘(オブジェクトの指定)
     .Value = Range("A1")  ‘ .Value =”やきめし” なども可能
     .RowSource = "Sheet1!A1:A6"
     .Style = fmStyleDropDownList ‘ 選択肢以外は入力規制
   End With
End Sub

 

よし、またできることがひとつ増えた!

スポンサーリンク

複数選択が可能な チェックボックス(CheckBox)(その1)

                  10   11   12   13   14

とりあえず使えるエクセルユーザーフォーム超入門(もくじ)

 

スポンサーリンク

 


#エクセル #Excel #ユーザーフォーム #マクロ #VBA

文字列をテキストファイルとして保存するマクロ [すぐに使えるエクセル・マクロ集 ]

k-create.hatenadiary.com

 

100行や1000行のファイルも一瞬で出力

基本的な文章の中の一部分だけが異なるテキストを多数作りたいときには、今回紹介する「文字列をテキストファイルとして保存するマクロ」が役に立ちます。

For文などを使って繰り返せば、100行でも、1000行でも一瞬でファイルが出力できます。差し替える部分のみをExcelの表にしておき、それを読み込むこともできます。

カンマ(,)で区切っておけば、「*.csv」ファイルもできますので、エクセルで計算した値をほかのアプリケーションで読みこむといった芸もできるようになります。

今回、いつものように重要構文として、「VBA FileSystemObject ファイル操作」を紹介しようと試みましたが、十分理解できないので、無理やりまとめるのはやめて、参考になるリンクを紹介することとしました。

理解していなくても、見よう見まねでやってみるのも私流。それでもやりたいことがあれば、だいたいが何とかなります(言いわけ)。

 

サンプルコード

Sub save_textfile()
'=======================================
'
' 文字列をテキストファイルとして保存するマクロ
'
'=======================================

'textの作成
  text_sum = ""
  For i = 1 To 1000
         text_sum = text_sum & "sample" & i & vbNewLine
  Next i

  ’ ↑↑↑ ここを工夫すれば、いろいろなテキストに対応できます。


'保存するファイル名の入力
  save_text = InputBox("保存するファイル名を入力してください。", "ファイル名の入力", "index")

  If save_text = "" Then
    MsgBox "マクロを中止します"
    End
  End If

'保存するフォルダの選択
  Set obj = CreateObject("Shell.Application"). _
       browseforfolder(0, "フォルダを選択してください", 0) 'obj:保存するフォルダ名

'パスの取得
  If obj Is Nothing Then
    '未選択の場合
    MsgBox "マクロを中止します"
    End
  ElseIf obj = "デスクトップ" Then
    'デスクトップを選択した場合
    Set MyWSH = CreateObject("WScript.Shell")
    save_dir = MyWSH.SpecialFolders("Desktop")
  Else
    'その他を選択した場合
    save_dir = obj.Items.Item.Path '保存フォルダ(obj)の絶対パスの取得
  End If

  ChDir save_dir

'ファイルの保存
  save_text_name = save_text & ".txt"

  Set fs = CreateObject("Scripting.FileSystemObject")
  fs.CreateTextFile save_text_name     'ファイルの作成
  Set f = fs.GetFile(save_text_name)    'f:ファイルの絶対パス

  Set ts = f.OpenAsTextStream(2, -2) '(ForWriting, TristateUseDefault)
  ts.Write text_sum
  ts.Close

End Sub

 

重要構文

(1)文字列の足し算

文字列を繋ぎ合わせる時は「&」を使います。
数字の計算でいう「+」の代わりですね。

「text_sum = text_sum & ・・・」と数式でいうと成り立たないカタチになっていますが、『変数 text_sum に &以下のものを繋ぎ合わせて、新しい変数 text_sum にしろ』という命令になります。

固定のテキストは「 ” 」(ダブルクオーテーション)で囲みます。

(2)文字列の改行

文字列を改行するには、「vbNewLine」と書いておきます。

(3)For文を使って繰り返し文章の作成

For文と「text_sum = text_sum & ・・・ & i & ・・・」とを組み合わせることで、繰り返し文章を作成することができます。このサンプルでは i を1~1000としましたので、1000行のアウトプットが出来ていると思います。

何はともあれ、やってみるのが早いです。
「i」を「i * 2」と掛け算してみることも可能です。

コピペしていろいろ触ってみてください。

(4)ファイルの保存に関する一連の操作(難解)

説明しようと試みましたが、私自身理解しきれておらず説明が難しいため(汗)、参考となるリンクを記載しておきます。(理解をしていなくても何とかなる例)

VBA FileSystemObject ファイル操作の基礎
https://www.tipsfound.com/vba/18001

 

k-create.hatenadiary.com

 

スポンサーリンク

 

パスを含むファイル名からファイル名のみを抽出するマクロ [すぐに使えるエクセル・マクロ集]

k-create.hatenadiary.com

 

2つファイルを開いて、それぞれのファイルを行き来きする

前回「Excelファイルを開くマクロ」 を紹介しましたが、2つファイルを開いて、それぞれのファイルを行き来しながらデータをやり取りする際、「とりあえず使えるエクセルVBAマクロ超入門 / ExcelVBA特有の基本構文」で紹介した、

複数のワークブック(既に開かれているエクセルファイル)が存在し、データのやり取りをする場合は、次のように記述してそのワークブックを選びます。

Windows("Book1.xls").Activate Book1.xlsを選びます。

というケースがでてきます。ただ、Application.GetOpenFilenameで取得したファイル名は「C:\Documents and Settings\・・・・・\book.xls」のように、 パスを含めた文字列となってしまいます。

そこで、「book.xls」といったように、ファイル名だけを取得する必要が出てくるわけです。このようにファイル名のみが必要になるケースが種々出てくるため今回、パスを含むファイル名からファイル名のみを抽出するマクロを紹介することとしました。

 

考え方

考え方はいたって簡単。パスを含むファイル名の文字列(A)から、パスのみの文字列(B)を差し引くのみ。

 (A)パスを含むファイル名
  C:\Documents and Settings\・・・・・\新しいフォルダ\book.xls
 (B)パスのみの文字列
  C:\Documents and Settings\・・・・・\新しいフォルダ

 

サンプルコード

Sub extract_filename()
'=======================================
'
' パスを含むファイル名からファイル名のみを抽出するマクロ
'
'=======================================

'Fileの選択
  filename_path = Application.GetOpenFilename("ファイル名,*.*")
  If filename_path = "False" Then
    MsgBox ("マクロを中止します")
    End
  End If

'ドライブの検出
  drive00 = Left(filename_path, 1)

'パスの検出
  filepath = CurDir(drive00)

'文字列数のカウント:(A)パスを含むファイル名
  length_path_A = Len(filename_path)

'文字列数のカウント:(B)パスのみの文字列
  length_path_B = Len(filepath)

'文字列数のカウント:ファイル名のみ
  length_filename = length_path_A - length_path_B - 1 '「-1」は\マーク分

'ファイル名の抽出
  filename00 = Right(filename_path, length_filename)

'ファイル名の表示(このマクロでのアウトプットの確認用)
  MsgBox filename00

End Sub

スポンサーリンク

 

重要構文

(1)Len([文字列A])

[文字列A]の文字数を返します。

(2)Left([文字列B],[正の整数C])

[正の整数C]の数だけ[文字列B]の左から抽出します。
右から抽出する場合はRight([文字列B],[正の整数C])。

(3)CurDir([ドライブD])

[ドライブD]で指定されるドライブの現在のパスを返します。
[ドライブD]を省略すると、現在のドライブのパスを返します。

(4)MsgBox [E]

[E]で指定される文字列、数値などの値を返します。(このマクロでのアウトプットの確認用)

 

重要構文の組み合わせ

今回紹介したマクロ、よくよく見てみると、重要構文で紹介した基本的な構文の組み合わせでしかありません。

のちのち、「なーんだこんな便利なやり方があったんだー」とスペシャルなやり方を知ることもしばしばですが、はじめから便利なやり方を探してばかりだと、進まないことがあります

このように、工夫しながら基本構文の組み合わせて対応していく「チカラ技」。結構、好きです。

 

k-create.hatenadiary.com

スポンサーリンク

 

Excelファイルを開くマクロ [すぐに使えるエクセル・マクロ集]

いろいろなアプリケーションを使っていると、そのアプリケーションでは対応していないグラフを作ってみたいとか、計算処理をしてみたいといった気持ちになるときがあります。

それらのアプリケーションに共通のデータフォーマットである「*.csv」や「*.txt」などの形式で生データを出力するできる機能があれば、エクセルマクロを活用することによって、実現できる可能性があります。

k-create.hatenadiary.com

 

そのスタート地点で有効なのがExcelファイルを開くマクロ」です。Excel形式でファイルを開くことができれば、あとはそれに元にして、表にしたり、グラフにしたり、計算したり、必要なデータのみ抽出したり、といったことが可能になります。

一度だけの処理であれば、生データをもとに処理していけばいいのですが、同じ作業を何度も実行する場合に、マクロ化が力を発揮します。

 

 [これまでに活用した事例]

  • 計測機器で取得したデータをグラフ化
  • 数値計算ソフトの結果から必要なデータのみを抽出して整理

 

今回は、Excelで別のファイルを開くマクロのサンプルコードを紹介します。

 

サンプルコード

Sub read_file()
'=======================================
'
' Excelでファイルを開くマクロ
'
'=======================================

'Fileの選択
  filename00 = Application.GetOpenFilename("ファイル名,*.*")
  If filename00 = "False" Then
    MsgBox ("マクロを中止します")
    End
  End If

'Excelでファイルを開く
  Workbooks.Open Filename:=filename00

End Sub

 

重要構文

(1)Application.GetOpenFilename("[文字列A],[拡張子B]")

実行するとファイルを開くダイヤログが表示され、ファイルの種類の欄に任意に設定した [文字列A]が表示。ダイヤログに表示されるファイルは[拡張子B]で指定できる。拡張子 は「*.xls」「*.csv」「*.txt」のように設定する。特に指定しないときはワイルドカード「*.*]を設定。

この構文では「C:\Documents and Settings\・・・・・\book.xls」のように、 パスを含めた文字列としてファイル名を取得します。

※ファイル名のみを抽出したい場合は、次回公開予定の「パスを含むファイル名からファイル名のみを抽出するマクロ」をお待ちください。

 

(2)Workbooks.Open Filename:=[文字列C]

[文字列C]で規定されるファイルをエクセル形式で開く。[文字列C]はパスを含むものでも、 ファイル名のみでもよい。ファイル名のみとする場合は、アクティブになっている保存場所が 指定される。対象ファイルの存在場所とアクティブになっている場所が異なる場合は当然開けない。

k-create.hatenadiary.com

 

スポンサーリンク

 

複数のユーザーフォームで変数を共有する パブリック変数(Public)[とりあえず使えるエクセルユーザーフォーム超入門]

Lesson3 これだけは覚えておきたい基本機能

複数のユーザーフォームを組み合わせて使用するようになると、前段階のフォームで入力内容を次のフォームの初期値にするなど、データを共有する必要性が高まってきます。

しかし、フォームが変わるということはプロシージャ(Sub ~ End Sub)が変わることであり、通常は変数が受け渡しできません。そこで、あらかじめパブリック変数という、プロシージャの壁を越えて、データをやり取りできる変数を定義することが必要です。

以前紹介したDim関数はローカル変数といい、プロシージャが終了すると変数もクリアされます。

k-create.hatenadiary.com

 

このDim関数をプロシージャの外に出し、モジュール(プロシージャの書かれているシート)の先頭エリアに独立して書いたものをモジュールレベル変数と呼びます。こうすると同じモジュールの中であれば、プロシージャの枠を超えて、変数を共有することができます。

モジュールには「フォームモジュール」「標準モジュール」「シートモジュール」などがありますが、そのモジュールの枠をも超えるのがパブリック変数です。定義する場所はモジュールレベル変数と同じで、異なるのはDimの代わりにPublicとすることです。

このようにパブリック変数を定義しておけば、データのやり取りが可能となります。
ただし、不必要にパブリック変数とすると、いらぬバグを誘発する恐れがあるので最低限の変数のみを対象とし、かつ、パブリック変数であることが分かりやすい変数名とすることをおススメします。

f:id:k_create:20180924020828p:plain

スポンサーリンク

選択肢リストを配置する コンボボックス(ComboBox)

                9   10   11   12   13   14

とりあえず使えるエクセルユーザーフォーム超入門(もくじ)

 

スポンサーリンク

 


#エクセル #Excel #ユーザーフォーム #マクロ #VBA