• ベストアンサー

配列を返り値、でエラー

Excelで、ボタンが押されるとファンクションを呼び出し、 指定した文字列を文字列型の配列に格納して返す、 というマクロを作成したいのですが ―Sheet1―――――――――――― Private Sub btn_Click() Dim inpt(3) As String inpt = Module1.getArg() End Sub ―――――――――――――――― ―Module1――――――――――― Function getArg() As String() Dim ret(3) As String ret(0) = "1番目" ret(1) = "2番目" ret(2) = "3番目" getArg = ret End Function ―――――――――――――――― inpt = Module1.getArg() の部分で「配列には割り当てできません」とエラーが出てしまいます。 色々試してはみたのですが、どうも解決できません。 ヒントだけでも構いませんのでご助力お願いします。

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

  • ベストアンサー
回答No.3

「配列には割り当てできません」というエラーは Dim inpt(3) As String ReDim inpt(4) とするのと同じエラーですから、 「宣言時に要素数を定義した配列は要素数を変更することができない」 ということですね。 Excel などの VBA では関係ないかもしれませんが、 CやC++では Static 変数や要素数が決まっている配列が割り当てられるメモリ領域と、動的に( VB の ReDim のような方法で)割り当てられるメモリ領域は異なっていて、別々に管理されています。おそらく開発ツールの VB ( VBA ではない)もC/C++と同じメモリ管理手法を取っていると思われるのですが、この仕様はそのあたりから来たものではないかと思います。 ( 「VBA では VB とは違って宣言時に要素数を定義した配列を ReDim できる」ようにできなくもないような気もするのですが・・・) 何にしろ、そういう仕様だから、ということには間違いないと思います。

shime-saba
質問者

お礼

なるほど…そういう事でしたか。 以前に動的に配列の要素数を変更したくて Dim inpt(3) As String ReDim inpt(4) と同じような事をやってエラーが出ていた事を思い出しました。 その際には Dim inpt() As String ReDim inpt(4) で解決できていたのに… もうちょっと学習しながらコーディングするべきですね。反省です。 他の言語を例に出して頂き、非常に分かりやすかったです。 ありがとうございました。

その他の回答 (2)

回答No.2

あー、聞かれると思ったけど、 私はわかりません。 詳しい人の回答待ってみて。 個人的には、getArgで返ってくる配列の個数が 確定しない場合もあるので、そういう仕様に なってるんだと思うけど。

shime-saba
質問者

お礼

GuruGuru22さんの仰っている内容で合ってるのでは、と 素人なりに思いましたが、そういう内部に詳しい方が回答して下さるのを 首を長くして待とうと思います。 GuruGuru22さん、ご回答頂いて本当にありがとうございました。

回答No.1

ヒントっつーか、答えだけど。 Dim inpt() As String にしてみそ。

shime-saba
質問者

お礼

あ、ホントですね…動きました。 物凄く迅速かつ明確な回答ありがとうございました。 そこで一つ質問させて頂きたいのですが 配列の長さを指定して宣言していたら何故いけなかったのでしょうか 少し詳しい説明頂けるとありがたいです。

関連するQ&A

  • 配列のメリットは?

    下記のコードは同じ動作をします。 Sub 普通() Dim moji1 As String Dim moji2 As String moji1 = Range("a1").Value moji2 = Range("a2").Value MsgBox moji1 & moji2 End Sub --------------------------------------------- Sub 配列() Dim moji(2) As String moji(1) = Range("a1").Value moji(2) = Range("a2").Value MsgBox moji(1) & moji(2) End Sub こういう場合は配列を使ったほうがいいのでしょうか? それとも配列は避けたほうがいいのでしょうか?

  • VBAで配列内のエラー値の取得

    エクセルのシートのセル範囲を配列に取り込み処理(他のでーたとの比較)をしようとしています。 ところがデータにエラー値があると型が一致しないというエラーになり失敗します。 非常に単純化して書くとこんな場合です。 myW(1, 2)はエラー値です。 Sub test001()   Dim myW   myW = Selection.Value   MsgBox myW(1, 2) End Sub しょうがないのでエラー値だった場合は文字列にしてしようと試行錯誤の結果、functionを使って下記のようになりました。 Sub test002()   Dim myW   myW = Selection.Value   If IsError(myW(1, 2)) Then     MsgBox Emsg(myW(1, 2))   Else     MsgBox myW(1, 2)   End If End Sub Function Emsg(ByVal x As Variant) As String   Select Case x     Case CVErr(xlErrDiv0): Emsg = "#DIV/0!"     Case CVErr(xlErrNA): Emsg = "#N/A"     Case CVErr(xlErrName): Emsg = "#NAME?"     Case CVErr(xlErrNull): Emsg = "#NULL!"     Case CVErr(xlErrNum): Emsg = "#NUM!"     Case CVErr(xlErrRef): Emsg = "#REF!"     Case CVErr(xlErrValue): Emsg = "#VALUE!"   End Select End Function 現在、これで動いてはおりますが、。もっと簡単にエラー値を文字列として取得できる方法はないでしょうか?たとえばセルの値ならエラー値でも Sub test0001()   MsgBox Cells(1, 2).Text End Sub で取得できますが、いったん配列に入れてしまうとできません。

  • 配列をテキストファイルに書き込むことは不可能でしょうか?

    Sub Macro1() Dim No As Long No = FreeFile 文字列 = "1234" Open "D:\Test.txt" For Output As #No Print #No, 文字列 Close #No End Sub 上記のMacro1の文字列の書き込みは可能なのですが Sub Macro2() Dim No As Long Dim 配列 As Variant Range("a1").Value = "1☆2☆3☆4☆" No = FreeFile 配列 = Split(Range("A1").Value, "☆") Open "D:\Test.txt" For Output As #No Print #No, 配列 Close #No End Sub だと「Print #No, 配列」で「型が一致しません」とエラーになってしまいます。 テキストファイルに配列を書き込みたいのですがどうすればいいのでしょうか? よろしくお願い致します。

  • アクセス フィールド名の変更

    フィールド名 [1],[2],・・・・を [090701],[090702],・・・ に変更するように Dim i As String Dim ret As String ret = InputBox("入力例  090701") i = ret DoCmd.RunSQL "SELECT [クエリ112].[1] AS [" & i & "], [クエリ112].[2] AS [" & i + 1 & "], ........中略 End Sub としましたが [090701],[90702],[90703],・・・ 2番目から 090702 になりません。 どのようにすればよいのか教えていただけませんか。

  • vb.netでByte型の実配列サイズが大きい件

    vb.netでByte型の配列を100byteで宣言しましたが、実際の配列サイズは101byteになりました。 (例) Module Module1 Sub Main() Dim buffSize As Integer = 100 Dim inputBuff(buffSize) As Byte Dim ii As Integer = inputBuff.Length Console.WriteLine("バッファサイズ = {0}", ii) End Sub End Module ここで、iiは、101となります。 CとかC++では、有り得ない仕様ですが、どういう意味が有るのでしょうか? ご教示お願い致します。

  • VB6で配列を文字列に変換する方法?

    VisualBasic6を使っております。 Dim ary() As Byte Dim s as String 配列を文字列に変換したり、文字列を配列にしたいのですが どのようにすれば良いのでしょうか?

  • Excel VBA配列をFunctionに渡す

    こんばんは、引数について教えてください。 Excel VBAの関数を作っていましたが、 1.Function ColumnArrayの部分でコンパイルエラーが発生し、  「配列がありません」と表示されます。  引数を配列のみで渡した場合、問題なく渡せるようですが、  他の引数と、CriteriaArrsの配列と一緒に渡せないのでしょうか。  すべて配列として1つにまとめて渡さなければならないのでしょうか。 2.CriteriaArrs = Array("田中", "鈴木")の部分は、文字列の増減が発生しますので  配列はParamArray  CriteriaArrs()とした方がよいのでしょうか 説明が不足している点があるかもしれませんが宜しくお願いいたします。 Function ColumnArray(SheetName As Worksheet, _ StartCell As Range, _ FieldColumn As Long, _ CountColumn As Long, _ CriteriaArrs As Variant _ ) As Long ・・・ End Function ------------------------------------- sub test() Dim CriteriaArrs() As Variant Dim SheetA As WorkSheet DIm RangeA range CriteriaArrs = Array("田中", "鈴木") set SheetA =Worksheet(1) set RangeA=Range("B3") FilterCount = ColumnArray(SheetA, RangeA, 3, 2, CriteriaArrs) end sub

  • 配列を関数に渡す方法

    VB6.0のプログラムで質問があるのですが 下のプログラムのように配列num、num1を関数AAAに 渡したいと思うのですがどうすればいいのでしょうか? よろしくお願いいたします。 Option Explicit Private num(10) As Integer Private num1(10) As Integer Private Sub Write_Click()    AAA(num)    AAA(num1) End Sub Private Function AAA(???)    Dim i As Integer    For i = 1 To 10       ???(i) = i    Next i End Function

  • VB.NET 2つの配列を連動して並び替える

    VB.NETで2つの配列の一方を文字列の長い順番に並び替えて 他方の配列もその順番に並び替えたいのですが どのようにすればよろしいでしょうか。 例えば、 A(0)="Japan" A(1)="America" A(2)="People's Republic of China" A(3)="Republic of Korea" A(4)="Democratic People's Republic of Korea" B(0)="Tokyo" B(1)="Washington, D.C." B(2)="Beijing" B(3)="Seoul" B(4)="Pyongyang" という2つの配列があって 配列A()を文字列の長い順番に並び替えると A(0)="Democratic People's Republic of Korea" A(1)="People's Republic of China" A(2)="Republic of Korea" A(3)="America" A(4)="Japan" となりますが、この時配列B()も以下のように 配列A()の順番と同じ順番になってほしいのです。 B(0)="Pyongyang" B(1)="Beijing" B(2)="Seoul" B(3)="Washington, D.C." B(4)="Tokyo" なお、配列A()の並べ替えは以下のようにしていますので できましたら、このコードに追記する感じで 教えていただけるとありがたいです。 よろしくお願いします。 ------------------------------------------------------ Module Module1 Sub Main() Dim A(4) As String Dim B(4) As String A(0) = "Democratic People's Republic of Korea" A(1) = "People's Republic of China" A(2) = "Republic of Korea" A(3) = "America" A(4) = "Japan" B(0) = "Pyongyang" B(1) = "Beijing" B(2) = "Seoul" B(3) = "Washington, D.C." B(4) = "Tokyo" Dim comp As New LengthComparer() Array.Sort(A, comp) For Each s As String In A Console.WriteLine(s) Next End Sub Public Class LengthComparer Implements System.Collections.IComparer Implements System.Collections.Generic.IComparer(Of String) Public Function Compare(ByVal x As String, ByVal y As String) As Integer _ Implements System.Collections.Generic.IComparer(Of String).Compare If y Is Nothing AndAlso x Is Nothing Then Return 0 End If If y Is Nothing Then Return -1 End If If x Is Nothing Then Return 1 End If Return y.Length.CompareTo(x.Length) End Function Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _ Implements System.Collections.IComparer.Compare If y Is Nothing AndAlso x Is Nothing Then Return 0 End If If y Is Nothing Then Return -1 End If If x Is Nothing Then Return 1 End If If Not (TypeOf y Is String) Then Throw New ArgumentException("String型でない", "y") ElseIf Not (TypeOf x Is String) Then Throw New ArgumentException("String型でない", "x") End If Return Me.Compare(DirectCast(y, String), DirectCast(x, String).Length) End Function End Class End Module ------------------------------------------------------

  • VB 配列

    今,VBでテキストファイルを読込み配列に入れるという作業を書いたのですが,うまくいきません. 初回例外が発生してしまいます.配列は文字列の配列になります. どなたかご教示のほどよろしくお願いいたします. 'ファイルの読込み Dim path1 As String = "C:\Users\aleph_H.S\Desktop\気象台データインポートツール\気象台データインポートツール\" Dim path2 As String = "気象台データリスト.txt" Dim Mypath As String = path1 + path2 ' StreamReader の新しいインスタンスを生成する Dim cReader As New System.IO.StreamReader(Mypath, System.Text.Encoding.Default) ' 読み込んだ結果をすべて格納するための変数を宣言する Dim stResult As String = String.Empty Dim matrix(,) As String Dim ic As Long = 0 Dim icc As Long = 0 ReDim Preserve matrix(80, 3) ' 読み込みできる文字がなくなるまで繰り返す While (cReader.Peek() >= 0) ' ファイルを 1 行ずつ読み込む Dim stBuffer As String = cReader.ReadLine() ' 読み込んだものを追加で格納する stResult &= stBuffer & System.Environment.NewLine ic = ic + 1 'カンマ区切りで分割して配列に格納する Dim stArrayData As String() = stResult.Split(","c) For Each sstData In stArrayData icc = icc + 1 '文字列をInteger型に変換 matrix(ic - 1, icc - 1) = sstData Next End While cReader.Close()

専門家に質問してみよう