Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4183 / 13646 ツリー ←次へ | 前へ→

【58025】ユーザーフォームでも反映される宣言について YOU 08/9/28(日) 2:58 質問[未読]
【58026】Re:ユーザーフォームでも反映される宣言に... ichinose 08/9/28(日) 7:28 発言[未読]
【58027】Re:ユーザーフォームでも反映される宣言に... YOU 08/9/28(日) 10:04 質問[未読]
【58028】Re:ユーザーフォームでも反映される宣言に... ichinose 08/9/28(日) 10:33 発言[未読]
【58031】Re:ユーザーフォームでも反映される宣言に... YOU 08/9/28(日) 11:12 お礼[未読]

【58025】ユーザーフォームでも反映される宣言につ...
質問  YOU  - 08/9/28(日) 2:58 -

引用なし
パスワード
   標準モジュールで、"PUBLIC"で宣言し、設定した値をそのモジュールで呼び出したユーザーフォームで読み取り条件判断しようとさせていますが、どうも標準モジュールで設定した変数の値を読み込んでいないようです。
基礎的な事かもしれませんが、もしよろしければ、変数の宣言について、ご助言いただけますでしょうか?

【58026】Re:ユーザーフォームでも反映される宣言...
発言  ichinose  - 08/9/28(日) 7:28 -

引用なし
パスワード
   ▼YOU さん:
おはようございます。

>標準モジュールで、"PUBLIC"で宣言し、設定した値をそのモジュールで呼び出したユーザーフォームで読み取り条件判断しようとさせていますが、どうも標準モジュールで設定した変数の値を読み込んでいないようです。
↑この具体例を提示してください。

ユーザーフォームの構成(中のコントロールの配置の詳細)とかコード内容の提示

だれでもYOU さんが投稿された記述どおりに設定すれば、
この不具合が再現できる記述をお願いします。


さて・・・。

標準モジュールにて、宣言されたPublic変数、

例 
標準モジュールに

Public aa as long

と宣言された変数は、ユーザーフォームのモジュールの
どのプロシジャーでも

Private Sub UserForm_Activate()
 msgbox aa
End Sub

と一般的な記述で変数の値の取得や設定が出来ます。


*具体例

アクティブシートのセルA1に入力された数値を用いて、
1からセルA1までの総和(ΣA1)を計算して、結果をユーザーフォームに表示する

という仕様のプログラムを考えます。

セルA1が、 10なら 結果は、 55
セルA1が、 20なら 結果は、 210

等など・・。


1 準備

ラベル(Label1)を一つだけ配置したユーザーフォーム(Userform1)を
作成してください。

このUserform1のモジュールに

'================================================================
Private Sub UserForm_Activate()
  With Label1
    .Width = Me.Width
    .Font.Size = 16
    .Caption = mes
    .AutoSize = True
    End With
End Sub


標準モジュールに

'===============================================================
Option Explicit
Public mes As String
'===============================================================
Sub main()
  Dim ans As Long
  Dim g0 As Long
  Dim n As Long
  
  With ActiveSheet
    If IsNumeric(.Range("a1").Value) Then
     n = .Range("a1").Value
     ans = 0
     For g0 = 1 To n
       ans = ans + g0
       Next
     mes = "Σ" & n & " = " & ans
    Else
     mes = "セルA1は、数字ではありません"
     End If
    UserForm1.Show
    End With
End Sub

2操作

アクティブシートのセルA1に適当な数字を入力して
mainを実行してみてください。

指定された数値から、総和を計算し、ユーザーフォームに結果が表示されます。


3結果

このようにPublic宣言した変数は、簡単に他のモジュールで
引用できます。

いえ、扱いが簡単だから、乱用したり、手続きが曖昧な使い方をすると、
もう何がなんだかわからないコードになってしまうのです。

Public変数って、使い方は難しいですよ!!

本当は、続きがありますが、先に本題の

>標準モジュールで、"PUBLIC"で宣言し、設定した値をそのモジュールで呼び出したユーザーフォームで読み取り条件判断しようとさせていますが、どうも標準モジュールで設定した変数の値を読み込んでいないようです。

が解決してからにしましょう。

【58027】Re:ユーザーフォームでも反映される宣言...
質問  YOU  - 08/9/28(日) 10:04 -

引用なし
パスワード
   おはようございます。
私の書いたコードは以下の通りです。標準モジュールが2つありますが、どちらからユーザーフォームにアクセスしたかによって、走らせるプログラムを切り替えようとしています。 どちらの標準モジュールかを判断させるためにSEETの変数で判断させています。どうぞ、よろしくお願いします。

Public SEET As Variant
Private Sub CommandButton1_Click() ’ユーザーフォーム
If SEET = 1 Then
Call load_np
ElseIf SEET = 2 Then
Call load_np2
End If
Unload Me
End Sub

Public SEET As Variant
Public Sub スタート()'標準モジュール1
SEET = 1
UserForm1.Show 
End Sub

Public SEET As Variant
Public Sub スタート2()'標準モジュール2
SEET = 1
UserForm1.Show 
End Sub

【58028】Re:ユーザーフォームでも反映される宣言...
発言  ichinose  - 08/9/28(日) 10:33 -

引用なし
パスワード
   ▼YOU さん:
>私の書いたコードは以下の通りです。標準モジュールが2つありますが、どちらからユーザーフォームにアクセスしたかによって、走らせるプログラムを切り替えようとしています。 どちらの標準モジュールかを判断させるためにSEETの変数で判断させています。どうぞ、よろしくお願いします。

ユーザーフォームのモジュールに宣言した
Public SEET As Variant


標準モジュール1の
Public SEET As Variant


標準モジュール2
Public SEET As Variant

これらの3つの変数は、名前が同じでも別の変数ですよ!!
これは、バグでもありません!!

従って、

標準モジュール1で

>SEET = 1
>UserForm1.Show 

のコードを実行して


ユーザーフォームで

If SEET = 1 Then

と記述しても、別の変数を参照しているのですから、

>標準モジュールで設定した変数の値を読み込んでいないようです

という結果になるのです。


>Public SEET As Variant
>Private Sub CommandButton1_Click() ’ユーザーフォーム
>If SEET = 1 Then
>Call load_np
>ElseIf SEET = 2 Then
>Call load_np2
>End If
>Unload Me
>End Sub

↑このコードをそのまま生かしましょう。


'Public SEET As Variant ←要りません 削除して
>Public Sub スタート()'標準モジュール1
with userform1
  .SEET = 1
  .Show
  end with 
>End Sub


>
'Public SEET As Variant ←要りません 削除して
>Public Sub スタート2()'標準モジュール2
 with userform1
  .SEET = 2
  .Show
  end with 
>End Sub


標準モジュールのコードを上記のように変更してください

【58031】Re:ユーザーフォームでも反映される宣言...
お礼  YOU  - 08/9/28(日) 11:12 -

引用なし
パスワード
   ご親切に、ありがとうございます。
おかげさまで、実行成功しました!
 with userform1
  .SEET = 2
  .Show
  end with 
こんな風に書けばよかったんですね、一人で考えてもこういう書き方は思いつきませんでした。 宣言も1つでよかったんですね。 すごく、勉強になりました。朝早くからどうもありがとうございました。 感謝します。

4183 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free