VBAのUserFormでサブルーチンを用いる方法と、コンパイルエラーの解決法

このQ&Aのポイント
  • VBAのUserFormでサブルーチンを使う方法について説明します。また、コンパイルエラーが発生した場合の解決法も紹介します。
  • UserFormのコードにサブルーチンを追加する方法と、コンパイルエラーの原因と解決法について解説します。
  • VBAのUserFormでサブルーチンを使用する際に起こりがちなコンパイルエラーについて説明します。解決法も紹介します。
回答を見る
  • ベストアンサー

VBAのUserFormでサブルーチンを用いる

UserFormのコードに次のように書いてbuttomを押してみると コンパイルエラー:ByRef引数の型が一致しません。 と出てしまいます。 どこが間違っているのでしょうか?ご回答お願いします。 Private Sub buttom_Click() Dim i As Integer Dim name As String i = 1 name = "名前" Call test(i , name) End Sub ---------------------------------------------- Sub test(i As Integer, name As String) Cells(i , 1) = name End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • kybo
  • ベストアンサー率53% (349/647)
回答No.1

こちらの環境ではエラーにならないので、確証は持てませんが、おそらく、「name」という変数名がまずいのではないかと思います。 変数名「name」をさしあたりない、「j」とかに変更して動作を再確認してみてください。 ※VBAの中に「Name」というオブジェクトとプロパティがあるので、そういうものとかぶらない変数名にしないと誤動作の原因になります。

bensharman
質問者

お礼

ご回答ありがとうございます。 実は上のコードは他にもいろいろ処理がある中でバグがあることが分かっている部分を抜き出したコードだったんですけども、他の部分をコメントアウトして上のコードだけにしたら私の環境でも問題なく動作しました。 いろいろいじってみたところ最初の変数を宣言するところで Dim i, j, k As Integer などと宣言していたのを Dim i As Integer Dim j, k As Integer と二つに分けてみたら正しく動作しました。 ご回答をいただいたおかげで解決の糸口が見つかりました。 ありがとうございました。

関連するQ&A

  • 値渡しについて

    UserForm1で以下のように求めた値「R」を UserForm2に渡すにはどのようにすればよいのでしょうか。 **************************************** <UserForm1(コード)> Public R As Integer ----------------------------------- Private Sub CommandButton1_Click()    Dim N As Integer        :    N = TextBox1.Text    R= N * 2 + 3        : End Sub **************************************** <UserForm2(コード)> Private Sub CommandButton1_Click()   Dim i As Integer       :   For i = 4 To R       :   Next i       : End Sub **************************************** どなたか教えて下さい。

  • Excel VBA でExecuteExcel4Macro("GET.OBJECT(48,

    エクセル2000です。 以前、ワークシートに配置したフォームツールのラベルの参照元を取得するマクロをご教示いただき、以下のTest01は問題なく作動しています。 Sub test01() Dim obj As Object Dim i As Integer Dim obj_n As String 'オブジェクトの名前 With ActiveSheet For Each obj In .Labels i = i + 1 .Cells(i, 2) = obj.Name: obj_n = obj.Name .Cells(i, 3) = obj.TopLeftCell.Address 'GET.OBJECT で、リンクがないものを取ると、False になる .Cells(i, 5) = ExecuteExcel4Macro("GET.OBJECT(48,""" & obj_n & """)") .Cells(i, 6) = obj.OnAction Next End With End Sub 今回、同一シートではなく別シートに表示させようと以下のTest02を書いたのですが、やってみると .Cells(i, 5) はすべて#VALUE!エラーになってしまいました。 ExecuteExcel4Macro("GET.OBJECT(48~がどのようなものかわからずやっているので応用がききません。(そもそも48って?) どのようになおしたらよいのかご教示いただければ幸いです。 Sub test02() Dim obj As Object Dim i As Integer Dim obj_n As String Dim ws As Worksheet, ns As Worksheet Set ws = ActiveSheet Set ns = Worksheets.Add With ns For Each obj In ws.Labels i = i + 1 .Cells(i, 2) = obj.Name: obj_n = obj.Name .Cells(i, 3) = obj.TopLeftCell.Address .Cells(i, 5) = ExecuteExcel4Macro("GET.OBJECT(48,""" & obj_n & """)") .Cells(i, 6) = obj.OnAction Next End With End Sub

  • VB6.0の参照渡し

    VC++6.0で作成したDLLへVBの配列を渡そうと思っています。 いくつかためしたのですが、 「配列引数は ByRef でなければなりません。」 というエラーがでてしまいます。 標準モジュール内の記述 Declare Function fncTest Lib "Test.dll" (ByRef test() As Long) As Long フォーム内 Private Sub Test_Click() dim test() as Long dim i as integer for i = 0 to 3 test(i) = i next i fncTest(Test()) End Sub とりあえず、こんな形でかいてみましたが、 Sub内のtest()の宣言方法、使用法等ご指導お願いします。

  • VBAにてリストボックスに表示された文字をエクセルのセルにコピペするには

    先日、ここで教えてもらった以下の内容で、幾つかのテキストボックスに表示された内容のうち、電話番号をエクセルのセルに転記する方法が、上手くいきません。”検索"名のシート上で実行します。 過去のログを参考にしましたが、解決できませんでした。 またお世話になりますが、だれか教えてください。 Private Sub CommandButton1_Click() Dim Namae As String Dim MeNamae As UserForm Dim ken As String Namae = TextBox1.Text Set MeNamae = UserForm1 Call 検索(Namae, MeNamae) End Sub Public Sub 検索(ByVal Namae As String, ByRef MeNamae As UserForm) Dim Nagasa As Integer Dim i As Long Dim MaxRows As Long Dim kensaku As Worksheet Dim KensakuChar As String Dim ListNamae As String Dim ListChar As String Dim KBanme As Integer Dim LBanme As Integer Set kensaku = Worksheets("顧客データ") MaxRows = kensaku.UsedRange.Rows.Count Nagasa = Len(Namae) MeNamae.ListBox1.Clear For i = 3 To MaxRows ListNamae = kensaku.Cells(i, 3) KBanme = 0 LBanme = 0 Do Do While Nagasa >= KBanme KBanme = KBanme + 1 KensakuChar = Mid(Namae, KBanme, 1) If KensakuChar <> " " Then Exit Do End If Loop Do While Nagasa >= LBanme LBanme = LBanme + 1 ListChar = Mid(ListNamae, LBanme, 1) If ListChar <> " " Then Exit Do End If Loop If KensakuChar = ListChar Then If Nagasa = KBanme Then With MeNamae .ListBox1.AddItem (ListNamae) .ListBox1.List(.ListBox1.ListCount - 1, 1) = i End With End If Else Exit Do End If Loop Until Nagasa <= KBanme Next End Sub Private Sub ListBox1_Click() Dim r As Long With ListBox1 If .ListIndex > -1 Then r = .List(.ListIndex, 1) '選択した名前の行 TextBox6.Value = Worksheets("顧客データ").Cells(r, 3) 'カタカナ名 TextBox2.Value = Worksheets("顧客データ").Cells(r, 5) '漢字名 TextBox3.Value = Worksheets("顧客データ").Cells(r, 7) '住所 TextBox4.Value = Worksheets("顧客データ").Cells(r, 1) '電話番号 TextBox5.Value = Worksheets("顧客データ").Cells(r, 2) '顧客番号 End If End With End Sub Private Sub CommandButton3_Click() 'クリックすると  Worksheets("検索").Cells(, 2) ’このシートの(G2)に上記の電話番号が入力される End Sub

  • Excel VBA ByRef引数の型?

    Excel2010でセルに関数式を埋め込むマクロを書いています。 そこで、「ByRef引数の型が一致しません」というエラーが出て困っています。 プログラムの中からエラーの出る所だけを取り出してtest1,test2として試したところ、 test1はエラーが出て、test2はプログラムが動いて目的とするセルに関数式が挿入されました。 Sub test1() dim i, myR as integer myR = 30 For i = 7 To 31 Cells(4, i) = "=IF(" & ConvertToLetter(i) & i - 4 & "="""","""",SUM(" & ConvertToLetter(i) & "5:" & ConvertToLetter(i) & myR & ")/(" & myR & "-COUNTIF(" & ConvertToLetter(i) & "5:" & ConvertToLetter(i) & myR & ","""")))" next i End Sub test1でConvertToLetter(i)のiが青色で選択され「ByRef引数の型不一致」エラーとなってしまいます。 そこで、試しに一度変数iの値をkに渡して同じプログラムをtest2として実行してみました。 Sub test2() dim i, k, myR as integer myR = 30 For i = 7 To 31 k=i Cells(4, i) = "=IF(" & ConvertToLetter(k) & i - 4 & "="""","""",SUM(" & ConvertToLetter(k) & "5:" & ConvertToLetter(k) & myR & ")/(" & myR & "-COUNTIF(" & ConvertToLetter(k) & "5:" & ConvertToLetter(k) & myR & ","""")))" next i End Sub このtest2は、きちんと実行され、目的とするG4(~AE4)のセルに =IF(G3="","",SUM(G5:G30)/(30-COUNTIF(G5:G30,""))) という式が挿入されました。 質問1:なぜ、test1がダメで、test2ならうまくいくのかという理由がわかりません。 質問2:うまくいったtest2と同じ式を、もっと長いプログラムの中に入れるとやはり「ByRef引数の型が一致しません」エラーが出てプログラムが止まってしまいます。test2単独のプログラムならうまく動くのに、他のプログラムの一部に埋め込むとエラーが出る理由もわかりません。 VBAプログラムを試行錯誤しながら勉強している初心者です。どなたかご教示お願いします。 ちなみに、ConvertToLetterは、 Function ConvertToLetter(iCol As Integer) As String Dim iAlpha As Integer Dim iRemainder As Integer iAlpha = Int((iCol - 1) / 26) iRemainder = iCol - (iAlpha * 26) If iAlpha > 0 Then ConvertToLetter = Chr(iAlpha + 64) End If If iRemainder > 0 Then ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64) End If End Function という、関数で定義しています。

  • 全くの初心者ですVBA

    どこが悪いかわかりません。 教えてください。 Sub テスト() Dim kekka As String Dim i As Integer tokuten = Worksheets("Sheet1").Cells(i, 1).Value For i = 1 To Worksheets("Sheet1").Range("A1").End(xlDown).Row.Count If tokuten >= 80 Then kekka = "合格" Else kekka = "不合格" kekka = Cells(i, 2) End If Next i End Sub シート1の A列に数値で得点が入っています。

  • VBAで縦一列に数字を入力したい

    Private Sub CommandButton1_Click() Dim n As Integer Dim i As Integer Dim x As Integer For i = 1 To n x = i + 3 n = InputBox("層数の値を入力してください") Cells(3, 1).Value = ("基板") Cells(x, 1).Value = i x = x + 1 Next End Sub 上記のようなマクロを組んだのですが、4行目に1が入ってとまってしまいました。 これを完成させるにはどうしたらいいでしょうか?

  • ExcelVBAでUserFormのカウント

    ユーザーフォームはどれも開いていない状態です。 カウントしようと Sub test01() Dim i As Long Dim uf As UserForm For Each uf In UserForms i = i + 1 Next MsgBox i End Sub としてみましたが0になってしまいます。 どう書けばいいのでしょうか?

  • VBA 標準モジュールとフォーム (続き)

    先ほど、同じ質問タイトルで質問させていただいたものです。この場合どうなりますか? モジュールでの変数file_nameをフォームのボタンをクリックしたら"text.xls"が表示されるようにしたいです。 (イメージとしては、エクセルのsheet1にコマンドボタンがあってクリックするとフォームが立ち上がってフォームのコマンドボタンをクリックすると"test.xls"が表示される) モジュール Private Sub CommandButton1_Click() ←エクセルsheet1にボタンがある   dim file_name as string file_name="test.xls"   UserForm1.Show End Sub フォーム(UserForm1) Sub CommandButton1_Click() ←フォームにボタンがある MsgBox file_name End Sub

  • [Excel2000_VBA] 型が一致しませんメッセージが表示

    各サイトを調べたのですが、自分のレベルに合った解答内容がなくよく理解できなかったので、質問させて頂きます(初歩的な質問で申し訳ありません) ユーザー定義を使用し、以下のコードを作ってみました。 配列を引数にして、まとめて返したいと考えていますが、構造体を使用すると「型が一致しません」と表示されてしまいます。 何が原因しているのでしょうか? さっぱり分かりませんので、ご教示お願いいたします。 Type test aaaa As Integer End Type Sub sbTest() Dim myAns() As test myAns = Sample1(myAns) End Sub Function Sample1(ByRef Ans() As test) Dim i As Integer Dim ret(0 To 9) As test For i = 0 To 9 ret(i).aaaa = i Next Ans = ret '配列名で配列を戻り値 End Function

専門家に質問してみよう