質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

1171閲覧

vbaでdialogのオブジェクトから引数を設定する

nonnon8.

総合スコア19

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/03/05 13:40

編集2019/03/05 13:45

vbaでダイアログの入力値を引数として利用したいのですが何度試してもエラーがでます。

ダイアログのeditboxesに入力した数値を
vbaのプロシージャの引数として利用したいのですが
可能でしょうか。何度やってもエラーが出ます。
以下内容です。
editboxesの値を変数cell_rowに入れています。
public cell_row as variantで定義しておりスコープ変数としています。

vba

1Sub zero_cross_color(cell_row) 2'1個目のプロシージャ 3 4 For x = 10 To 368 5 6 If Cells(x, cell_row).Value >= 0 And Cells(x + 1, cell_row).Value <= 0 Then 7 8 9 10 Range(Cells(x, cell_row), Cells(x, cell_row).Offset(1, 0)).Select 11 Selection.Interior.Color = RGB(256, 256, 0) 12 13 14 ElseIf Cells(x, cell_row).Value <= 0 And Cells(x + 1, cell_row).Value >= 0 Then 15 16 17 Range(Cells(x, cell_row), Cells(x + 1, cell_row)).Select 18 Selection.Interior.Color = RGB(256, 256, 0) 19 20 Else 21 22 23 End If 24 25 Next x 26 27End Sub 28

vba

1Sub 呼び出し() 2 Call zero_cross_color(DialogSheets("dialog1").EditBoxes("列").Text) 3End sub

このvbaでしたいこと

Sin xθの波形でどこでプラマイに切り替わるか、などを調べています。このvbaはその一つですが、
どうしてもダイアログを使用して、引数を設定したいです。
2行目までは認識しているようですが、cell_rowの部分はダイアログ入力値が反映されています。
それ以降は定義が不明?かよくわかりません。

うまく伝えられませんがお手数ですがよろしくお願いします。

対処

  • 変数にダイアログの値を使わずにそのまま入力すると普通に実行できます。
  • 変数定義をintegerにしてもエラーは出ました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

解決対処

ベストアンサーにあるようにCInt()でeditboxesのtextを数値として扱うことで問題なくプロシージャは実行されました。定義については引数内で定義しなくとも今のところは問題ないようです。
他、ワークブックやシートの指定はしなくとも大丈夫でした! ダイアログを開いても、アクティブ状態である様子です。

プロシージャはここに載せている以外にもいくつかあるので補足すると、CInt()は整数数値にするものなので必要に応じて小数として認識できるCSng()を使い分けるようにします。

投稿2019/03/06 13:25

nonnon8.

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

エラーメッセージが書かれていないため推測で回答しますが、現段階では以下の2点を改善する必要があると思います。

  1. zero_cross_color()内のCells, Rangeが含まれるシートを明確に示す
  2. Cells() の引数に文字列でなく数値を渡す

Cells, Rangeが含まれるシートを明確に示す

シートを指定せずに単にCellsRangeと書いた場合、アクティブなシート上のセルを参照します。
そのため、ダイアログシートがアクティブな状態で実行するとセルの参照先が見つからずにエラーが出ます。
今回の場合は以下のように、セルが属するシートを指定すれば良いと思います("シート名"は適切に設定してください)。

vba

1ThisWorkbook.Worksheets("シート名").Cells(i, j) 2ThisWorkbook.Worksheets("シート名").Range(ThisWorkbook.Worksheets("シート名").Cells(i, j), ThisWorkbook.Worksheets("シート名").Cells(k, l))

Cells() の引数に文字列でなく数値を渡す

Cells()の引数には数値を入れる必要がありますが、EditBoxes("列").Textは文字列として取得されます。値を数値として渡すために、CInt()を用いて以下のようにプロシージャをコールしてみてください。

vba

1 Call zero_cross_color(CInt(DialogSheets("dialog1").EditBoxes("列").Text))

その他気になった点

public cell_row as variantで定義しておりスコープ変数としています。

との記述があり、おそらくcell_rowをモジュールレベルのスコープを持つ変数として宣言しているのでしょう。
しかし、今回はEditBoxesの値をzero_cross_color()に渡すだけなので、以下のようにすれば十分かと思います。

vba

1Sub zero_cross_color(ByVal cell_row as Integer) 2 '省略 3End Sub 4 5Sub 呼び出し() 6 Call zero_cross_color(CInt(DialogSheets("dialog1").EditBoxes("列").Text)) 7End Sub

お役に立てれば幸いです。

投稿2019/03/05 15:11

編集2019/03/05 15:17
nmoa

総合スコア54

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nonnon8.

2019/03/06 13:21

ありがとうございました^^とても分かり易かったです!自己解決フォームに解決は載せます! 本当にありがとうございます^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問