Excel VBA質問箱 IV

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

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


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

【61444】clickイベントへの引数の渡し方 satsuki 09/5/8(金) 14:45 質問[未読]
【61446】Re:clickイベントへの引数の渡し方 neptune 09/5/8(金) 15:04 発言[未読]
【61447】Re:clickイベントへの引数の渡し方 satsuki 09/5/8(金) 16:12 質問[未読]
【61448】Re:clickイベントへの引数の渡し方 neptune 09/5/8(金) 16:47 回答[未読]
【61450】Re:clickイベントへの引数の渡し方 satsuki 09/5/8(金) 17:41 質問[未読]
【61451】Re:clickイベントへの引数の渡し方 neptune 09/5/8(金) 18:26 回答[未読]
【61462】Re:clickイベントへの引数の渡し方 satsuki 09/5/11(月) 9:49 お礼[未読]

【61444】clickイベントへの引数の渡し方
質問  satsuki  - 09/5/8(金) 14:45 -

引用なし
パスワード
   スレッド61292で以前質問させて頂いた内容に、新たな修正を加えたく、
ご質問させて頂きます。

修正する度に行数が変わるエクセルシートを印刷するため、
改ページ位置をその都度指定して印刷できるよう、
ユーザーフォームで改ページの指定を促すようにしました。

下記のように教えて頂き、上手く作動しています。
'標準モジュール
Sub insatsu()
  Dim gyo As Long
  Dim Ws As Excel.Worksheet
  Dim HPBreak As Excel.HPageBreak

  Set Ws = ActiveSheet
  gyo = 50

  ActiveSheet.DisplayPageBreaks = True
  
  UserForm1.Show vbModeless

End Sub

' Userformモジュール
Private Sub CommandButton1_Click()
  ' 行追加処理 ...
End Sub

上記の「行追加処理」以外にも、別プロシージャで、
罫線を引く処理や印刷処理などを行っています。
シートによって罫線位置やタイトル範囲が違うので変数に入れるように
したのですが、同じような変数(gyoやTitleAreaなど)が何度も出てくるので、
まとめようとしてグローバル変数を宣言するべく、使い方を検索していましたら、
グローバル変数の弊害について書かれており、極力避けるようにとのことでした。

そのサイトで推奨されていたのは、ユーザー定義型でしたので、
下記のように宣言し、引数渡しをするよう設定いたしましたが、
call insatsu(MyShokichi As Shokichi)によって呼び出される
UserForm1のclickイベントには上手く引数を渡すことができません。
あちこち調べましたが、わかりませんでしたので、
どなたかご教示お願いいたします。

Type Shokichi  
 TitleArea As Range
 TitleGyo As Integer
 gyo As Integer
 MaxRetsu as Integer
   ・
   ・
End Type

Sub settei()
  
 Dim MyShokichi As Shokichi

 Dim Ws As Excel.Worksheet
 Dim HPBreak As Excel.HPageBreak

 Set Ws = ActiveSheet
    
 Set MyShokichi.TitleArea = '範囲
 Set MyShokichi.TitleGyo = '数値
   ・
   ・
 call insatsu(MyShokichi As Shokichi)

end sub

【61446】Re:clickイベントへの引数の渡し方
発言  neptune  - 09/5/8(金) 15:04 -

引用なし
パスワード
   ▼satsuki さん:
こんにちは

>そのサイトで推奨されていたのは、ユーザー定義型でしたので、
>下記のように宣言し、引数渡しをするよう設定いたしましたが、
>call insatsu(MyShokichi As Shokichi)によって呼び出される
>UserForm1のclickイベントには上手く引数を渡すことができません。
普通↑のような事はしません。(本家のVBでは絶対しません。)

このような場合の為に、標準モジュールや、クラスモジュールなど
外部に公開可能はモジュールが用意されています。

こういう場合は、標準モジュールに記述した引数付きプロシージャを
UserFormから呼び出す方法をとる事が多いと思います。

即ち標準モジュールに
・ユーザー定義型の広域のスコープを宣言しておき、
・public sub(又はfunction) insatsu(MyShokichi As Shokichi)
 のようなプロシージャを作成します。

これならどこからでも呼べます。

【61447】Re:clickイベントへの引数の渡し方
質問  satsuki  - 09/5/8(金) 16:12 -

引用なし
パスワード
   ▼neptune さん:
お返事ありがとうございます。

>このような場合の為に、標準モジュールや、クラスモジュールなど
>外部に公開可能はモジュールが用意されています。
>こういう場合は、標準モジュールに記述した引数付きプロシージャを
>UserFormから呼び出す方法をとる事が多いと思います。
下記のようにSub insatsu()の中にUserForm1を呼び出す記述があるのですが、
UserForm1からinsatsu(MyShokichi As Shokichi)を呼び出すとなると、
UserForm1を開くモジュールはどのようにすればよいのでしょうか?

Sub insatsu()
  ・
  ・
  ・
 UserForm1.Show vbModeless
End Sub

' Userformモジュール
Private Sub CommandButton1_Click()
  ' 行追加処理 ...
End Sub

>即ち標準モジュールに
>・ユーザー定義型の広域のスコープを宣言しておき、
>・public sub(又はfunction) insatsu(MyShokichi As Shokichi)
> のようなプロシージャを作成します。
下記の部分は標準モジュールに記述されており、他のプロシージャもすべて
標準モジュールに書いているのですが。
Type Shokichi  
 TitleArea As Range
 TitleGyo As Integer
 gyo As Integer
 MaxRetsu as Integer
   ・
   ・
End Type

public insatsu(MyShokichi As Shokichi)のようにすると
プロシージャを作動させようとしたときのメニューにでないので
やはり下記モジュールからcallして動かすのですよね?
Sub settei()
   ・
   ・
 Set MyShokichi.TitleArea = '範囲
 Set MyShokichi.TitleGyo = '数値
   ・
   ・
 call insatsu(MyShokichi As Shokichi)
end sub

【61448】Re:clickイベントへの引数の渡し方
回答  neptune  - 09/5/8(金) 16:47 -

引用なし
パスワード
   ▼satsuki さん:

先ず、
そもそも論を書くと、良く放置にされてしまうので敢えて書きませんでしたが、
イベントプロシージャはシステムにより定義されるもので、
ユーザー(今回の場合プログラムを書く人)が勝手に変更する事は
出来ません。

>下記のようにSub insatsu()の中にUserForm1を呼び出す記述があるのですが、
呼び出せません。・・・と言うより、insatsuを実行してはいけません。
最後の所で表示させてますよね。

>UserForm1からinsatsu(MyShokichi As Shokichi)を呼び出すとなると、
>UserForm1を開くモジュールはどのようにすればよいのでしょうか?
1.insatsu(MyShokichi As Shokichi)
の定義に直して下さい。
2.別にuserformを開くプロシージャを作成して下さい。
3.Type Shokichi  を
  public Type Shokichi  
に明示的に広域のスコープを持たせて下さい。

>public insatsu(MyShokichi As Shokichi)のようにすると
>プロシージャを作動させようとしたときのメニューにでないので
>やはり下記モジュールからcallして動かすのですよね?
settei、insatsu、UserForm内、その他の処理が良く判らないのでなんとも
言えませんが、必要な所で
>callして動かす
です。

用語の使い間違えを指摘しておきます。(間違えると読む人がややこしいので)
モジュールとは、
クラスモジュール、オブジェクトのモジュール(シート、
userformなど)があり、基本的にイベント等オブジェクトに関わるコードを
書く所。
標準モジュールは特別なモジュールで、どのモジュールからも見る事が出来る
モジュールです。

【61450】Re:clickイベントへの引数の渡し方
質問  satsuki  - 09/5/8(金) 17:41 -

引用なし
パスワード
   ▼neptune さん:
お返事ありがとうございます。

>1.insatsu(MyShokichi As Shokichi)
>の定義に直して下さい。
>2.別にuserformを開くプロシージャを作成して下さい。
>3.Type Shokichi  を
>  public Type Shokichi  
>に明示的に広域のスコープを持たせて下さい。

2.別にuserform1を開くプロシージャを作成し、UserForm1を開くように
しました。
Public Sub Yobidashi()
   ・
   ・
 UserForm1.Show vbModeless
End sub

3.Publicでユーザー定義型を宣言しました。
Public Type Shokichi  
 TitleArea As Range
 TitleGyo As Integer
 gyo As Integer
 MaxRetsu as Integer
   ・
   ・
End Type

1.Sub insatsu(MyShokichi As Shokichi)の定義に直し、
Userform1のclickイベントの中でcallしました。
>settei、insatsu、UserForm内、その他の処理が良く判らないのでなんとも
>言えませんが、必要な所で
>>callして動かす
>です。
Sub insatsu(MyShokichi As Shokichi)
  ・
'印刷処理
  ・
End Sub

' Userformモジュール
Private Sub CommandButton1_Click()
 call insatsu(MyShokichi As Shokichi) ←ここでエラー
 ' 行追加処理 ...
End Sub

Sub settei()は、変数に値を入れるプロシージャです。
Sub settei()
 Dim MyShokichi As Shokichi
   ・
   ・
 Set MyShokichi.TitleArea = '範囲
 Set MyShokichi.TitleGyo = '数値
   ・
   ・
end sub

Sub insatsu(MyShokichi As Shokichi)などの中では、
ユーザー定義型を変数として使用しています。
UserForm1の中では、改ページ指定した後の足りない行を
挿入しています。

ユーザーフォーム以外は、すべて標準モジュールに記述しています。
call insatsu(MyShokichi As Shokichi)のところで、
「修正候補:区切り記号または)」というエラーがでます。
call insatsu(MyShokichi)としてみると
「Byref引数の型が一致しません」というエラーがでます。

【61451】Re:clickイベントへの引数の渡し方
回答  neptune  - 09/5/8(金) 18:26 -

引用なし
パスワード
   ▼satsuki さん:

>ユーザーフォーム以外は、すべて標準モジュールに記述しています。
>call insatsu(MyShokichi As Shokichi)のところで、
>「修正候補:区切り記号または)」というエラーがでます。
正しくは、
call insatu(MyShokichi)

>call insatsu(MyShokichi)としてみると
>「Byref引数の型が一致しません」というエラーがでます。
これはエラー内容そのまんまで、恐らく、
call insatu(MyShokichi)
を書いているプロシージャ内で
dim MyShokichi as As Shokichi
と書いていないと想像します。

こういう事書くと、気を悪くすると思いますが、余りにも基礎知識が
不足しています。
今回の件が動くようになってからでも、以下のようなwebサイトか、
参考書を1冊購入して、基礎の勉強をする事をお勧めします。
で、なければ、理解も、少しの改造もできませんからね。
Let's Excel VBA
ht tp://www.sanynet.ne.jp/~awa/excelvba/kouza.html
Milk House
ht tp://www6.plala.or.jp/MilkHouse/menu.html

【61462】Re:clickイベントへの引数の渡し方
お礼  satsuki  - 09/5/11(月) 9:49 -

引用なし
パスワード
   ▼neptune さん、お返事ありがとうございます。

>正しくは、
>call insatu(MyShokichi)

>これはエラー内容そのまんまで、恐らく、
>call insatu(MyShokichi)
>を書いているプロシージャ内で
>dim MyShokichi as As Shokichi
>と書いていないと想像します。
この2点を修正いたしましたら、上手く作動しました。
ありがとうございました。


>こういう事書くと、気を悪くすると思いますが、余りにも基礎知識が
>不足しています。
>今回の件が動くようになってからでも、以下のようなwebサイトか、
>参考書を1冊購入して、基礎の勉強をする事をお勧めします。
>で、なければ、理解も、少しの改造もできませんからね。
>Let's Excel VBA
>ht tp://www.sanynet.ne.jp/~awa/excelvba/kouza.html
>Milk House
>ht tp://www6.plala.or.jp/MilkHouse/menu.html
はい、基礎知識がないため、教えていただいたとおりにやっていても
何が何だかわからないままです。
ご紹介頂いたサイトで勉強します。
ありがとうございました。

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