Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
標準モジュールからユーザーフォームの値を受け渡す2
投稿日時: 20/11/21 05:51:44
投稿者: ip8bk

解決済みになってしまいましたので、こちらで質問させていただきます。
(私のタッチミスだと思いますが^^;)
 
原因はイニシャライズではありませんね。
訂正ありがとうございます。
  
  
1点教えて下さい。
 

引用:
UserForms.Addで開いたフォームを変数に格納する

 
下記のコードのことでしょうか?
  
Set usf = UserForms.Add(usfName) 

 

回答
投稿日時: 20/11/21 09:40:43
投稿者: hatena
投稿者のウェブサイトに移動

ip8bk さんの引用:

引用:
UserForms.Addで開いたフォームを変数に格納する

 
下記のコードのことでしょうか?
  
Set usf = UserForms.Add(usfName) 

 

はい、そうです。

投稿日時: 20/11/21 10:44:45
投稿者: ip8bk

度々申し訳ございません。
今後のためにも下記についてもご回答いただけますでしょうか。
よろしくお願い致しますm(_ _)m
 

引用:

1) 最初のPublicはどのような意味があるのでしょうか?
2) call_usf "UserForm" & b、←このコードの意味も教えてください。
 

  
Public Sub call_usf(usfName As String)
    Dim usf As Object
    
    Set usf = UserForms.Add(usfName)
    
    '以下共通処理
    usf.TextBox1.Value = 3

    usf.Show
End Sub

Sub Test()
    Dim a As Long, b As Long
    a = ActiveCell.Row
    b = Application.WorksheetFunction.CountIf(Columns(3), Cells(a, 3).Value)

    call_usf "UserForm" & b
End Sub

 

回答
投稿日時: 20/11/21 12:09:08
投稿者: WinArrow
投稿者のウェブサイトに移動

横から失礼します。
  
 >Public
は、グローバル
 という意味です。
グルーバルとは、別のモジュールから参照できるということです。
  
Public a As String
のように変数に使用することも
Public Sub SAmple()
とか
public Function Sample1()
のようにプロシジャに使用することも
 できます。
 標準モジュールで記述します。
モジュール間のデータの受け渡しに使用します。
  
「値」のセットは、標準モジュールでもユーザーフォームモジュールでも可能です。
  
 >call_usf "UserForm" & b
別の書き方
 Call call_usf("UserForm" & b)
   
 >"UserForm" & b
は、引数です。
  
プロシジャには「()」をつけます。
 引数を持つ場合は、「()」の中に引数となる変数を記述します。
 引数を複数記述する場合は、「,」で囲って記述します。
  
例 普通の計算式をセルに入力すれば、できるが、敢えてVBAで記述すると
  
Function 三角形の面積(ByVal 底辺 As Long, ByVal 高さ As Long)
      三角形の面積 = 底辺 * 高さ / 2
 End Function
   
 Sub Test()
     Range("C1").Value = 三角形の面積(Range("A1").Value, Range("B1").Value)
 end Sub
   
   
  

投稿日時: 20/11/21 12:25:35
投稿者: ip8bk

ご回答ありがとうございます。
とても分かりやすくまとめていただきありがとうございます。
 
グローバル関数は使うことはありますが、public subの場合、publicを省略できると認識しておりますが、間違っておりますでしょうか?
 
publicとprivateの2つで使い分けていると思っています。

回答
投稿日時: 20/11/21 13:50:59
投稿者: WinArrow
投稿者のウェブサイトに移動

ip8bk さんの引用:

グローバル関数は使うことはあります

関数という表現には違和感があります。
関数という表現ではなく、
属性と表現がよいと思います。
 
変数やプロシジャの適用範囲(スコープ)を意味します。
 
ip8bk さんの引用:

public subの場合、publicを省略できると認識しておりますが、間違っておりますでしょうか?

間違っていません。
前レスで書き忘れていました。
 
Functionプロシジャも同じです。
 
 
ip8bk さんの引用:

publicとprivateの2つで使い分けていると思っています。

どこで、どのように使いのかを理解することです。
 
2つのほかに
Friend
Static
というのがあります。
使い方などは、ネット検索で調べてみるとよいでしょう。

回答
投稿日時: 20/11/21 14:27:20
投稿者: WinArrow
投稿者のウェブサイトに移動

本題の
「標準モジュールからユーザーフォームの値を受け渡す」
ですが、
むしろ、
ユーザーフォーム側から標準モジュールの値を貰いに行く(取得)すると
考えるとよいと思います。
 
標準モジュール側で
一つのユーザ-フォームを、複数回記述(実行)すると
別々のものとして「取り扱われます。
 
USerform1.Show
は、「表示する」というメソッドですが、
表示する前にメモリに展開します。
その展開処理が、「UserForm_Initialize」です。
 
また、
 Userform1.Textbox1.Text = 3
という命令を標準モジュールで実行した場合
テキストボックスに「値」を格納する前に
メモリに展開する必要があるため、
「UserForm_Initialize」が実行されます。
 
このようにユーザーフォームにアクセスするときに、
メモリ上に展開されている場合、Showは、表示のみが実行されます。
ですから、
.Show = Initializeではない・・・と覚えておくとよいでしょう。
 

投稿日時: 20/11/26 12:14:13
投稿者: ip8bk

ご教示いただきました皆様ありがとうございました。
解決いたしました。また、とても勉強になりました。