• ベストアンサー

sub又はfunctionが定義されていない??

プログラム内容 4たくの問題を乱数で出す(テスト用のPGのため数字にしていますが、実際は文字が入ります) Private Sub Form_Load() Dim Total As Integer Dim mo() As String Dim se_a() As String Dim se_i() As String Dim se_u() As String Dim se_e() As String Dim ka() As String Dim kai() As String Total = 3 ReDim mo(Total) As String ReDim se_a(Total) As String ReDim se_i(Total) As String ReDim se_u(Total) As String ReDim se_e(Total) As String ReDim ka(Total) As String ReDim kai(Total) As String '----------------------- mo(1) = "1 + 1" mo(2) = " 2 + 2" mo(3) = " 3 + 3" '----------------------------- se_a(1) = "2" se_a(2) = " 2" se_a(3) = " 2" se_i(1) = "3" se_i(2) = "3" se_i(3) = "3" se_u(1) = "4" se_u(2) = "4" se_u(3) = "6" se_e(1) = "7" se_e(2) = "5" se_e(3) = "9" '-------------------------- ka(1) = "ア" ka(2) = "ウ" ka(3) = "ウ" kai(1) = "a" kai(2) = "s" kai(3) = "s" '----------- End Sub Private Sub kotae_Click() kaitou.Visible = True End Sub Private Sub next_Click() Dim i As Integer kaitou.Visible = False i = Int(Rnd * Total) + 1 NO.Text = i MONDAI.Text = mo(i) select_a.Text = se_a(i) select_i.Text = se_i(i) select_u.Text = se_u(i) select_e.Text = se_e(i) kaitou.Text = ka(i) End Sub でエラーが出ます。何がおかしいのでしょうか MONDAI.Text = mo(i) にエラーがあるようなのですが・・・。 kai =解説

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

  • ベストアンサー
  • kmor
  • ベストアンサー率27% (225/825)
回答No.3

このサンプルコードだとできますよ。 ちゃんと"aaa"と表示されます。 Option Explicit Private mo() As String Private total As Integer Private Sub Form_Load() total = 3 ReDim mo(total) As String mo(0) = "aaa" Debug.Print mo(0) End Sub

daisuke-123
質問者

お礼

何とかできました。 ご回答ありがとうございました。

その他の回答 (2)

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.2

こんばんは。 mo(i) は、Form_Load() の中で宣言していますよね。 そうすると、Form_Load() のプロシージャ内でなければ使えないんです。 エラーになったところは、next_Click()というイベントプロシージャの中ですよね。 なので、m(i)は配列変数ではなく、プロシージャ(sub)かファンクションの 呼び出しと解釈されてしまったんですね。(括弧がついているから) (ここを消しても、この後の行で同じエラーが出るはずです) ということで、解決方法ですが、 Dimの最初の行からReDimの最後の行までの部分をsubの前に出してください。 そうすれば、他のsubやFunctionからも扱えるグローバルな変数となります。

daisuke-123
質問者

お礼

 ご回答ありがとうございました。

  • kmor
  • ベストアンサー率27% (225/825)
回答No.1

再び、kmorです。 このような場合、どこでどういうエラーが出るかを書いておくと非常に答えやすいですよ。 お察しのとおり、おそらく MONDAI.Text = mo(i) でエラーになっているんでしょう。 mo()はForm_Loadの中で定義されていますね。 VBはサブルーチン、ファンクションが変われば、その中で定義されている変数は使えないのです。 対策として、全てのサブルーチン、ファンクションの外で定義すれば出来ます。 Option Explicit Private mo() As String Private Sub Form_Load() ReDim mo(Total) as String : : End Sub といった感じです。

daisuke-123
質問者

補足

ご回答ありがとうございます はじめは奏していましたが、 total=3 というのが使えないようなのですが・・。 プロシジャーの外では無効ですと出てきます。

関連するQ&A

  • subまたはfunctionが定義されていません。

    エクセル2010で下記コードの矢印の部分でエラーが出てしまいます。 ほぼネットで見つけたコードそのままですが矢印のところで題記のエラーが出てしまいます。 内容はトヨタのホームページの燃料電池車の画像を保存するはずなのですが・・・ どなたかご存知の方ご教示いただけますでしょうか??? Sub aaa() GetImageFile "http://toyota.jp/sp/image/e_bn/", "FCV_20140625.jpg" End Sub Sub GetImageFile(ImgName As String, SaveName As String) Dim SaveFileName As String, DownloadFile As String, Ret As Long If ImgName = "" Then Exit Sub SaveFileName = SaveName DownloadFile = ImgName Ret = URLDownloadToFile(0, DownloadFile, SaveFileName, 0, 0) ’←ここです If Ret = 0 Then MsgBox "ダウンロードできました" Else MsgBox "エラーが発生しました" End If End Sub

  • vbaで配列に値を格納する場合

    vbaで配列に値を格納する場合 変数の宣言はどちらを使った方が良いのでしょうか? Sub Sample1() Dim i As Long Dim myStr As String Dim tmp() As String myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub か Sub Sample1() Dim i As Long Dim myStr As String Dim tmp As Variant myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub でも問題なく動くのですが、 Variant型での宣言はあまりしない方が良いですか? あと Dim tmp() As String ならエラーにならないのですが Dim tmp As String だとエラーになってしまう理由がよくわからないので教えて頂けますか?

  • VBA リーダーを選出したチーム分け

    名簿を作り、その名前をランダムでチームに分けるようにしたいです。 検索して以下のようなVBAを作成しました。 ※ チーム数は「TmCnt = 5」 Sub Sample() Dim Total As Integer Dim TmCnt As Integer Dim Data1 As Variant Dim Data2() As String Dim i As Integer, j As Integer, k As Integer Total = Cells(Rows.Count, 1).End(xlUp).Row TmCnt = 5 Data1 = Range("A1:A" & Total).Value ReDim Data2(1 To Total) Randomize For i = Total To 1 Step -1 j = Int(Rnd * i) + 1 Data2(i) = Data1(j, 1) Data1(j, 1) = Data1(i, 1) Next i i = 1 Do For j = 1 To TmCnt k = k + 1 Cells(i, j + 2).Value = Data2(k) If k = Total Then Exit Sub Next j i = i + 1 Loop End Sub 問題はA1~A5までの名前をランダムにリーダーとして各チームの1番目に配置する方法はどうしたら良いでしょうか? 宜しくお願いします。

  • 変数を配列に格納する時に、二つの条件を指定すること

    変数を配列に格納する時に、二つの条件を指定することはできますか? VBAです。 Private Sub test() Dim i As Long Dim Str As String Dim tmp As Variant Str = "a,i,u-e-o" tmp = Split(Str, ",") '配列に格納する For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub の場合、結果が a i u-e-o になってしまいます。 tmp = Split(Str, "," or "-") のようなことをして a i u e o と表示させたいです。 "a,i,u-e-o"を"a,i,u,e,o"にすることはできません。ご教授よろしくお願いします。

  • コンパイルエラーSubまたはFunction定義

    VBAユーザーフォーム作成の上記エラーについて VBA初心者です。 初心者ですので、本を見ながら作成していましたが、その通り作成したつもりがエラー表示が・・ シート上にユーザーフォームは出てくるようにして入力をしているのですが、ボタン(更新、追加、削除)やスピン移動をクリックすると「コンパイルエラー SubまたはFunctionが定義されていません」とでてきます。本の通りしたので何が悪かったのかよくわからなくなりました。 下記に本を見て作ったコードを書きますので教えて頂きたいです。素人すぎますので説明不足もありますが宜しくお願いします。 Private Sub Button更新_Click() データ書き込み (Spin移動.Value) End Sub Private Sub Button削除_Click() データ範囲.Rows(Spin移動.Value).Delete データ表示 (Spin移動.Value) Set データ範囲 = Range("A1").CurrentRegion Spin移動.Max = データ範囲.Rows.Count End Sub Private Sub Button終了_Click() 患者様データ.Hide End Sub Private Sub Button追加_Click() Dim AddRow As Integer AddRow = データ範囲.Rows.Count + 1   データ書き込み (AddRow) Textレコード.Text = Spin移動.Value - 1 & "/" & レコード数取得 Set データ範囲 = Range("A1").CurrentRegion Spin移動.Max = データ範囲.Rows.Count Spin移動.Value = データ範囲.Rows.Count データ表示 (AddRow) End Sub Private Sub MultiPage1_Change() End Sub Private Sub Option女_Click() End Sub Private Sub Option男_Click() End Sub Private Sub Spin移動_Change() If データ範囲.Rows.Count <> 1 Then データ表示 (Spin移動.Value) End If End Sub Private Sub TextIIIIV音_Change() End Sub Private Sub Text患者ID_Change() End Sub Private Sub Text生年月日_AfterUpdate() Text年齢.Value = DateDiff("yyyy", Text生年月日.Value, Now()) End Sub Private Sub UserForm_Initialize() Dim TBL(1 To 9) As Control Dim データ範囲 As Range Combo診療科.ColumnCount = 1 Combo診療科.AddItem "内科" Combo診療科.AddItem "外科" Combo診療科.AddItem "小児科" Combo主治医.ColumnCount = 1 Combo主治医.AddItem "今中尚子" Combo主治医.AddItem "岡井康葉" Set TBL(1) = Text患者ID Set TBL(2) = Text氏名 Set TBL(3) = Text生年月日 Set TBL(4) = Frame性別 Set TBL(5) = Combo診療科 Set TBL(6) = Combo主治医 Set TBL(7) = Text入院日 Set TBL(8) = Text退院日 Set TBL(9) = Combo指導医 Set データ範囲 = Range("A1").CurrentRegion Spin移動.Max = レコード数取得 + 1 If データ範囲.Rows.Count = 1 Then Else データ表示 2 End If End Sub Public Sub データ表示(行数 As Integer) Dim Cnt As Integer For Cnt = 1 To 9 Select Case Cnt Case 4 If データ範囲.Cells(行数, Cnt).Value = "男" Then Option男.Value = True Else Option女.Value = True End If Case Else Dim S For Cnt = 1 To 9 S = データ範囲cells(行数, Cnt).Value Next End Select Next If IsDate(Text生年月日.Text) Then Text年齢.Value = DateDiff("yyyy", Text生年月日.Value, Now()) Else Text年齢.Value = Null End If Textレコード.Value = Spin移動.Value - 1 & "/" & レコード数取得 End Sub Public Sub データ書き込み(行数 As Integer) Dim Cnt As Integer For Cnt = 1 To 9 Select Case Cnt Case 4 If Option男.Value = True Then データ範囲.Cells(行数, Cnt).Value = "男" Else データ範囲.Cells(行数, Cnt).Value = "女" End If Case Else データ範囲.Cells(行数, Cnt).Value = TBL(Cnt).Value ←このTBLの部分で青くなり上記エラー End Select Next End Sub Public Function レコード数取得() As Integer レコード数取得 = Range("A1").CurrentRegion.Rows.Count - 1 End Function

  • コンパイルエラーSubまたはFunction定義

    VBAユーザーフォーム作成の上記エラーについて VBA初心者です。 初心者ですので、本を見ながら作成していましたが、その通り作成したつもりがエラー表示が・・ シート上にユーザーフォームは出てくるようにして入力をしているのですが、ボタン(更新、追加、削除)やスピン移動をクリックすると「コンパイルエラー SubまたはFunctionが定義されていません」とでてきます。本の通りしたので何が悪かったのかよくわからなくなりました。 下記に本を見て作ったコードを書きますので教えて頂きたいです。素人すぎますので説明不足もありますが宜しくお願いします。 Private Sub Button更新_Click() データ書き込み (Spin移動.Value) End Sub Private Sub Button削除_Click() データ範囲.Rows(Spin移動.Value).Delete データ表示 (Spin移動.Value) Set データ範囲 = Range("A1").CurrentRegion Spin移動.Max = データ範囲.Rows.Count End Sub Private Sub Button終了_Click() 患者様データ.Hide End Sub Private Sub Button追加_Click() Dim AddRow As Integer AddRow = データ範囲.Rows.Count + 1   データ書き込み (AddRow) Textレコード.Text = Spin移動.Value - 1 & "/" & レコード数取得 Set データ範囲 = Range("A1").CurrentRegion Spin移動.Max = データ範囲.Rows.Count Spin移動.Value = データ範囲.Rows.Count データ表示 (AddRow) End Sub Private Sub MultiPage1_Change() End Sub Private Sub Option女_Click() End Sub Private Sub Option男_Click() End Sub Private Sub Spin移動_Change() If データ範囲.Rows.Count <> 1 Then データ表示 (Spin移動.Value) End If End Sub Private Sub TextIIIIV音_Change() End Sub Private Sub Text患者ID_Change() End Sub Private Sub Text生年月日_AfterUpdate() Text年齢.Value = DateDiff("yyyy", Text生年月日.Value, Now()) End Sub Private Sub UserForm_Initialize() Dim TBL(1 To 9) As Control Dim データ範囲 As Range Combo診療科.ColumnCount = 1 Combo診療科.AddItem "内科" Combo診療科.AddItem "外科" Combo診療科.AddItem "小児科" Combo主治医.ColumnCount = 1 Combo主治医.AddItem "今中尚子" Combo主治医.AddItem "岡井康葉" Set TBL(1) = Text患者ID Set TBL(2) = Text氏名 Set TBL(3) = Text生年月日 Set TBL(4) = Frame性別 Set TBL(5) = Combo診療科 Set TBL(6) = Combo主治医 Set TBL(7) = Text入院日 Set TBL(8) = Text退院日 Set TBL(9) = Combo指導医 Set データ範囲 = Range("A1").CurrentRegion Spin移動.Max = レコード数取得 + 1 If データ範囲.Rows.Count = 1 Then Else データ表示 2 End If End Sub Public Sub データ表示(行数 As Integer) Dim Cnt As Integer For Cnt = 1 To 9 Select Case Cnt Case 4 If データ範囲.Cells(行数, Cnt).Value = "男" Then Option男.Value = True Else Option女.Value = True End If Case Else Dim S For Cnt = 1 To 9 S = データ範囲cells(行数, Cnt).Value Next End Select Next If IsDate(Text生年月日.Text) Then Text年齢.Value = DateDiff("yyyy", Text生年月日.Value, Now()) Else Text年齢.Value = Null End If Textレコード.Value = Spin移動.Value - 1 & "/" & レコード数取得 End Sub Public Sub データ書き込み(行数 As Integer) Dim Cnt As Integer For Cnt = 1 To 9 Select Case Cnt Case 4 If Option男.Value = True Then データ範囲.Cells(行数, Cnt).Value = "男" Else データ範囲.Cells(行数, Cnt).Value = "女" End If Case Else データ範囲.Cells(行数, Cnt).Value = TBL(Cnt).Value ←このTBLの部分で青くなり上記エラー End Select Next End Sub Public Function レコード数取得() As Integer レコード数取得 = Range("A1").CurrentRegion.Rows.Count - 1 End Function

  • 初歩的な事だと思います。 Sub または Function が定義されていません。

    VBAの本を買ってきて、勉強をしているのですが、テキストに書いてある通り入力しても「Sub または Function が定義されていません。」となってしまいます。 Sub IfSample() Dim intData As Integer intData = clntInputbox("数値を入力して下さい", ("データ入力")) Select Case ingData Case 1 To 10 MsgBox "入力された値は1以上、10以下です" Case 10 To 100 MsgBox "入力された値は10より大きくて、100以下です" Case Else MsgBox "入力された値は100より大きいです。" End Select End Sub 実行すると、エラーがでて、Sub IfSample()が黄色く、 clntInputboxが反転された状態になります。 テキスト通りに入力できているか、なんども確認したのですが、特に間違っていないと思います。どこが悪いのでしょうか?

  • Functionの使い方が分かりません。

    ACCESS 2013環境でVBAを使用しています。 プログラムが長い上、使用する箇所が多くて困っています。 Functionで、使いたい時だけ呼び出したいのですが うまく行きません。 二つのテキストボックスに入力された、文字を組み合わせて 文字列を生成するプロシージャを作成しています。  txt1の値が、岡山  txt2の値が、オカヤマ の時 先頭の文字列が ア行、続きは _岡山 となるよう AscW関数で文字コードで一度抽出し, select文で判別しています。 コードは --------------------------------------------- Private Sub コマンド1_Click() Dim kanji As String Dim katakana As Integer Dim sento As String Dim hensuu As String kanji = Me.txt1 katakana = AscW(Left(Me.txt2,1)) Select Case katakana Case 12450 To 12458 sento = "ア行" Case 12459 To 12468 sento = "カ行" ~(中略)~    Case Else End Select hensuu = sento & "_" & kanji MsgBox hensuu End Sub --------------------------------------------- となっています。 Select Case文が長いのと、複数のフォーム上で実行させるボタンごとに 同じコードを記述していて、最近Accessの起動が遅くなってきました。 Select文をFunctionから呼び出し、最終的にはモジュールから呼び出しに 書き換えたいのですが、書き方が良く分かりません。 試したコード --------------------------------------------- Function moji(ByRef katakana As Integer,sento As String) Select Case katakana Case 12450 To 12458 sento = "ア行" Case 12459 To 12468 sento = "カ行" ~(中略)~    Case Else End Select End Function Private Sub コマンド1_Click() Dim kanji As String Dim katakana As Integer Dim sento As String Dim hensuu As String kanji = Me.txt1 katakana = AscW(Left(Me.txt2,1)) sento = moji(katakana) hensuu = sento & "_" & kanji MsgBox hensuu End Sub --------------------------------------------- 多分、大きく間違っているのではないかと思うのですが どのように修正したらよいでしょうか

  • VBA A1をA2に変更したい

    またお世話になります。 下記のはランダムにチーム分けするものです。 TmCnt = 5がチーム数です。 これはA1から氏名を読み取り、C1からランダムに表を作成するものです。 A2、C2に変更したいのです。 Data1 = Range("A1:A" & Total).Value A1をA2に変えましたが、「インテックスが有効範囲にありません」とエラーメッセージが出ます。 どこが違うのでしょうか? 宜しくお願いします。 Sub Sample() Dim Total As Integer Dim TmCnt As Integer Dim Data1 As Variant Dim Data2() As String Dim i As Integer, j As Integer, k As Integer Total = Cells(Rows.Count, 1).End(xlUp).Row TmCnt = 5 Data1 = Range("A1:A" & Total).Value ReDim Data2(1 To Total) Randomize For i = TmCnt To 1 Step -1 j = Int(Rnd * i) + 1 Data2(i) = Data1(j, 1) Data1(j, 1) = Data1(i, 1) Next i For i = Total To TmCnt + 1 Step -1 j = Int((i - (TmCnt + 1) + 1) * Rnd + TmCnt + 1) Data2(i) = Data1(j, 1) Data1(j, 1) = Data1(i, 1) Next i i = 1 Do For j = 1 To TmCnt k = k + 1 Cells(i, j + 2).Value = Data2(k) If k = Total Then Exit Sub Next j i = i + 1 Loop End Sub

  • VBA セルの値を取得する

    下記のはランダムにチーム分けするものです。 TmCnt = 5がチーム数です。 Sub Sample() Dim Total As Integer Dim TmCnt As Integer Dim Data1 As Variant Dim Data2() As String Dim i As Integer, j As Integer, k As Integer Total = Cells(Rows.Count, 1).End(xlUp).Row TmCnt = 5 Data1 = Range("A1:A" & Total).Value ReDim Data2(1 To Total) Randomize For i = TmCnt To 1 Step -1 j = Int(Rnd * i) + 1 Data2(i) = Data1(j, 1) Data1(j, 1) = Data1(i, 1) Next i For i = Total To TmCnt + 1 Step -1 j = Int((i - (TmCnt + 1) + 1) * Rnd + TmCnt + 1) Data2(i) = Data1(j, 1) Data1(j, 1) = Data1(i, 1) Next i i = 1 Do For j = 1 To TmCnt k = k + 1 Cells(i, j + 2).Value = Data2(k) If k = Total Then Exit Sub Next j i = i + 1 Loop End Sub TmCnt = 5をセル「B1」にチーム数を入力し、(例「6」「4」など)マクロを実行したいのです。 検索しましたところ、 セルの値を取得するにはRange("A1").Valueを入力だそうです。 TmCnt = 5を下記に書き換えるにはどのようにしたら良いでしょうか? Dim s As String s = Range(“B1”).Value Debug.Print(s) 宜しくお願いします。

専門家に質問してみよう