Excel VBA質問箱 IV

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

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


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

【53333】複数のプロシージャで white 08/1/2(水) 4:19 質問[未読]
【53334】Re:複数のプロシージャで かみちゃん 08/1/2(水) 7:48 発言[未読]
【53335】Re:複数のプロシージャで りん 08/1/2(水) 9:44 回答[未読]
【53336】Re:複数のプロシージャで かみちゃん 08/1/2(水) 10:27 発言[未読]
【53338】Re:複数のプロシージャで りん 08/1/2(水) 11:53 発言[未読]
【53339】Re:複数のプロシージャで white 08/1/2(水) 16:40 お礼[未読]

【53333】複数のプロシージャで
質問  white  - 08/1/2(水) 4:19 -

引用なし
パスワード
   Excel2000 でXPです
一つのシートにテキストボックスとコマンドボタンを2つずつ配置し、
ボタン1を押すとテキストボックスに入力された文字を入れ替えるという
マクロを組もうとしています。
ボタン2を押すとテキストが消去されるようにしています。
複数のプロシージャに分けてのマクロ作成を練習しています。

イベントプロシージャとして
Option Explicit
Private Sub CommandButton1_Click()
Dim box1 As String
Dim box2 As String
  inputTxt TextBox1.Text, TextBox2.Text
    Call inputTxt(box1, box2)
End Sub
Private Sub CommandButton2_Click()
Dim box1 As String
Dim box2 As String
  inputTxt "", ""
    Call inputTxt(box1, box2)
End Sub

標準モジュールに
Option Explicit
Sub inputTxt(box1 As String, box2 As String)
  TextBox1.Text = box2
  TextBox2.Text = box1
End Sub

と書きました。実行するとエラーがでて、
Sub inputTxt(box1 As String, box2 As String)
  TextBox1←変数が定義されてません

となってしまうんです。
ささいな間違いか、根本的な間違いか検討もつきませんが、
どなたか解決策をご教授いただけないでしょうか

【53334】Re:複数のプロシージャで
発言  かみちゃん  - 08/1/2(水) 7:48 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>と書きました。実行するとエラーがでて、
>Sub inputTxt(box1 As String, box2 As String)
>  TextBox1←変数が定義されてません

inputTxt TextBox1.Text, TextBox2.Text
Call inputTxt(box1, box2)
の部分は、
box1 = TextBox1.Text
TextBox1.Text = TextBox2.Text
TextBox1.Text = box1
でいいのではないでしょうか?

inputTxt "", ""
Call inputTxt(box1, box2)
の部分は、
TextBox1.Text = ""
TextBox1.Text = ""
でいいのではないでしょうか?

または、UserFormモジュールに
Sub inputTxt(box1 As String, box2 As String)
  TextBox1.Text = box2
  TextBox2.Text = box1
End Sub
と書いておいてもいいと思います。

さらに、UserFormモジュールのほうには、
Call inputTxt〜
という記述は不要です。
なぜなら、UserFormモジュール内で、変数box1、box2の代入が行なわれていないからです。

一方、
> 標準モジュールに
書きたい場合は、
UserFormモジュールの
inputTxt TextBox1.Text, TextBox2.Text
の部分は、
inputTxt Me, TextBox1.Text, TextBox2.Text
に、
inputTxt "", ""
の部分は、
inputTxt Me, "", ""
として、

標準モジュールには、
Sub inputTxt(obj As Object, box1 As String, box2 As String)
  obj.TextBox1.Text = box2
  obj.TextBox2.Text = box1
End Sub
とすればできると思います。

【53335】Re:複数のプロシージャで
回答  りん E-MAIL  - 08/1/2(水) 9:44 -

引用なし
パスワード
   white さん、こんにちわ。

>複数のプロシージャに分けてのマクロ作成を練習しています。
(略)
>どなたか解決策をご教授いただけないでしょうか

ということなので。解決策の一つを。

全部同じイベントプロシージャーに記述します。

Option Explicit
Private Sub CommandButton1_Click()
  inputTxt TextBox1.Text, TextBox2.Text
End Sub
Private Sub CommandButton2_Click()
  inputTxt "", ""
End Sub
Sub inputTxt(box1 As String, box2 As String)
  TextBox1.Text = box2
  TextBox2.Text = box1
End Sub

こんな感じです。

【53336】Re:複数のプロシージャで
発言  かみちゃん  - 08/1/2(水) 10:27 -

引用なし
パスワード
   こんにちは。かみちゃん です。

▼りん さん

教えてください。

>>複数のプロシージャに分けてのマクロ作成を練習しています。
>(略)
>>どなたか解決策をご教授いただけないでしょうか
>
>ということなので。解決策の一つを。
>
>全部同じイベントプロシージャーに記述します。

これ、53334で私が書いた
>> または、UserFormモジュールに
>> Sub inputTxt(box1 As String, box2 As String)
>>   TextBox1.Text = box2
>>   TextBox2.Text = box1
>> End Sub
>> と書いておいてもいいと思います。
と何が違うのでしょうか?

【53338】Re:複数のプロシージャで
発言  りん E-MAIL  - 08/1/2(水) 11:53 -

引用なし
パスワード
   かみちゃん さん、こんにちわ。

かみちゃんさんの発言の、
 box1 = TextBox1.Text
 TextBox1.Text = TextBox2.Text
 TextBox1.Text = box1
という方法は、「プロシージャーを分けた処理を勉強したい」とおっしゃる質問者さんの要望とずれていて、途中のUserFormは今回の質問では関係ないと思って見逃してました。最後のオブジェクトを渡す方法は私も一番に考えましたが、「解決法を知りたい」という質問者さんに、「てっとり早いのは(イベントと)同じとこに書くと解決ですよ」とアドバイスしたかったのです。

なので、この部分は完全に見落としてました。
>>> または、UserFormモジュールに・・・
>>> Sub inputTxt(box1 As String, box2 As String)
>>>   TextBox1.Text = box2
>>>   TextBox2.Text = box1
>>> End Sub
>>> と書いておいてもいいと思います。
同じでしたね。
ごめんなさい。

【53339】Re:複数のプロシージャで
お礼  white  - 08/1/2(水) 16:40 -

引用なし
パスワード
   返事をくださったお二方、ありがとうございました。
標準モジュールに書いていたコードを
イベントモジュール内に書くことで、エラーにならなくなりました。
大変参考になり、自分の勉強不足を痛感いたしました。

お二方には、重ねてお礼いたします。
ありがとうございました。

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