• ベストアンサー

ExcelVBAで配列をベースに配列を作る方法について

配列2つからそれぞれ要素を取り出して組み合わせ、 新たな配列を作りたくて下記のコードを書きましたが どうしても★のところで「コンパイルエラー:SubまたはFunctionが定義されていません。」 というエラーになってしまいます。すごく基本的なミスのようでお恥ずかしいのですが、 どうか解決方法・アドバイスをお願いいたします。m(_ _)m なお、最終的に作りたい配列の中身は下記のような規則性を持ったものです。 (後からもっと増やす予定なのでループでの処理を希望しています。) 'RankFirstCell = Array("B10", "B26", "B42", "B58", "B74", "H10", "H26", "H42", "H58", "H74", "N10", "N26", "N42", "N58", "N74") --- 問題の部分はここから --- Dim RankCols, RankRows As Variant RankCols = Array("B", "H", "N") RankRows = Array(10, 26, 42, 58, 74) Dim x, y, z As Byte Dim RankFirstCell(14) As String 'ここの記述の仕方の問題でしょうか? For x = 0 To 14 y = Application.WorksheetFunction.RoundDown(x / 5, 0) z = x Mod 5 RankFristCell(x) = RankCols(y) + RankRows(z) '★エラー行 Next x --- ここまで --- ちなみにx, y, zの値は下記のように希望通りループできているみたいです。(ウォッチウィンドウにて確認) x|y|z ------ 0|0|0 1|0|1 2|0|2 3|0|3 4|0|4 5|1|0 6|1|1 7|1|2 8|1|3 9|1|4 10|2|0 11|2|1 12|2|2 13|2|3 14|2|4 どうぞよろしくお願いいたします。

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.4

解決されたのなら良いのですが、 Dim RankFirstCell(14) As String と、 RankFristCell(x) で綴りが違っていますが、大丈夫でしょうか? あと、 Dim x, y, z As Byte で、メモリの節約をなさりたいのでしょうが、この書き方だと、x,yはVariantになってしまいます。(VBAの仕様です) また、現在の32bit CPUの時代では、long型にした方が速いという説もあります。

r_bel
質問者

お礼

自分でこの恥ずかしいスペルミスに気づいて最初のお三方へのお礼を記入している間に お返事をいただきまして、ありがとうございます! 結果的に x, y, zをVariant型にすべき点および Byte型の件へのご教授とアドバイスをいただくことができたので お礼書き込みと質問締め切りのタイムラグは私にとってめっちゃラッキーでした。 本当にありがとうございました!!!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.3

>RankFristCell(x) = RankCols(y) + RankRows(z) '★エラー行 文字列の加算”+”はしません。 文字を結合する場合は、”&”を使用します。

r_bel
質問者

お礼

ものすごく恥ずかしいことにFirstのスペルミスでした・・・。 と同時に文字列結合を+でしてしまっている激烈に恥ずかしいミスも ご指摘いただくまで全く気づいていなかったので、とても助かりました。 ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

何をしたいのかよく分からないので的確な回答になりませんが >Dim x, y, z As Byte Dim x, y, z As Integer >RankFristCell(x) = RankCols(y) + RankRows(z) 「+」は足し算ですから数値以外の演算はエラーになります  RankFristCell(x) = RankCols(y) & RankRows(z) ではないでしょうか

r_bel
質問者

お礼

ものすごく恥ずかしいことにFirstのスペルミスでした・・・。 と同時に文字列結合を+でしてしまっている激烈に恥ずかしいミスも ご指摘いただくまで全く気づいていなかったので、とても助かりました。 ありがとうございました! ちなみにByteの件はあえて0-255以外の整数は使わない見通しなので あえてメモリ負担を少しでも減らすために使っています。 たぶん気分の問題程度なのでしょうが・・・。(^^;

全文を見る
すると、全ての回答が全文表示されます。
  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

VBA知らない人間の戯言ですが >RankRows = Array(10, 26, 42, 58, 74) RankRows = Array("10", "26", "42", "58", "74") と違う? RankCols 足して RankRows 文字列作りたいんですよね? 文字と数字を足そうとしてその結果を文字に入れようとしてる ってのが間違いだと思いますが実際の書き方は分からなかったりする

r_bel
質問者

お礼

解決しました。 いただいた指摘に関しては、将来の可能性として計算しないとも限らないので あえて文字列ではなく数値として残しています。(間違っているかもしれませんが。) コメントありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • JavaScriptの配列について

    var old_array = Array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '<', '#', '/', '>', '%', '.', '*', '0', '!', '?', ':', '=', '|'); var new_array = Array('b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '<', '#', '/', '>', '%', '.', '*', '0', '!', '?', ':', '=', '|'); のような配列があり、 abcと入力するとbcd DEFと入力するとEFG 012と入力すると!23 というようなものを作りたいのですがどうすればいいでしょうか。

  • 配列のつなげ方

    配列をつなげて文字列にしたいと思っています。 Dim abc() As String Dim i As String Dim namae As String i=0 ここでDBに接続してループでまわしながらデータを取得してきます。 Do while y > z abc(i) = X i = i+1 loop Xはループがまわる毎に違う値がセットされます。例えば1回目のループでリンゴ、2回目のループでミカンといった具合にです。 つまり、abc(0)=リンゴ、abc(1)=ミカン、abc(2)=メロン といった具合にです。 最終的には namae="リンゴ、ミカン、メロン、・・・・"といった具合にnamaeに代入したいと思っています。namae = abc(0) & "," & abc(1) & ","....と やれば実現できるのはわかります。 Xにはデータがいくつはいっているかわかりません。どうやった式をたてれば、実現できるでしょうか?

  • 連想配列のキー値(連番)を基に、別の配列を作るには?

    下記のように、キー値の一部に連番を持った連想配列 があるのですが、このキー値と連番で別の配列を 簡単に作る方法は無いでしょうか? もとの配列 $ary = array("item0"=>"x","item1"=>"y","item2"=>"z","data0"=>"o","data1"=>"p","data2"=>"q"); 上の$aryから $item=array([0]=>"x",[1]=>"y",[2]=>"z"); $data=array([0]=>"o",[1]=>"p",[2]=>"q"); のような形の配列を得たいのです。 foreach($ary as $key => $val){ } の構文で、$key値を調べて分断し、新しい配列に pushしていくしかないでしょうか? ※PHP4.3です

    • ベストアンサー
    • PHP
  • PHPのようにスマートに配列の配列など記述する方法が

    PHPの場合、データ構造ですが以下のようになっています。 $a = array( "test1" => array( array(1,1), array("x", 2) ), "test2" => array( array(3,2), array("y", 1) ), ); これをエクセルVBAの場合、Scripting.Dictionaryを使えば連想配列が 可能ですが、PHPのようにスマートに配列の配列など記述する方法が わかりません。 Dim dic As Scripting.Dictionary set dic = New Scripting.dictionary dic.Add "test1", ???????????????? dic.Add "test2", ???????????????? スマートにデータ構造を実現できる方法が知りたいです。

  • 変数名(配列)の中の変数

    配列変数の名前の中に変数を入れたい場合、どのように記述すればいいのでしょうか? use strictを用いて、以下のように書いてみましたが、エラーが出て上手く動きません。 ループ x: 1-3 ループ y: 1-2 ${"answer$x"[$y]}=入力値 ←この部分を教えてください。    ループ閉 y ループ閉 x --------------------     answer1[1] answer1[2] answer2[1] answer2[2] answer3[1] answer3[2] とループを通るように、変数名を設定したいのですが、 エラーが出て実行ができません。 エラー:Can't use string ("answer1") as an ARRAY ref while "strict refs" in use at~ -------------------- 実際のプログラムは以下のように書いています。(該当部分のみ) for(my $x=1; $x<$num; $x++) { for (my $y=0; $y<$n; $y++) { my $y = ($x*$n)+$d; my @line = split(/\r/, $data[$y]); my @line0 = split(/\t/, $line[0]); ${"answer$x"[$y]} = $line0[0]; } } よろしくお願いします。

  • 配列の中身を入れ替える方法を教えてください

    配列の中身を入れ替える方法をどなたかおしえてください。下のプログラムはちゃんと実行されるんですが、いまいち納得できません。 特に・・・↓↓ void sort(int a[]) { int x,y,z,min; for(x=0;x<10;x++) { min=x; for(y=x;y<10;y++) { if(a[min]>a[y]) { min=y; } } z=a[min]; a[min]=a[x]; a[x]=z; } } 上の部分でなぜfor文を2回使うのか?2回目のfor文のところはなぜ y=xなのか?0ではいけないのか?よくわかりません。一番最後の入れ替え作業のところは納得できたんですが、for文のところがよくわからないのでどなたか分かる方教えてください! #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <time.h> void sort(int a[]) { int x,y,z,min; for(x=0;x<10;x++) { min=x; for(y=x;y<10;y++) { if(a[min]>a[y]) { min=y; } } z=a[min]; a[min]=a[x]; a[x]=z; } } int main(int argc, char* argv[]) { int a[10],b,c; srand((unsigned)time(NULL)); for(b=0;b<10;b++) { a[b]=rand(); c=a[b]; printf("a[%d]=%d\n",b,a[b]); } sort(a); for(b=0;b<10;b++) { printf("小さい順a[%d]=%d\n",b,a[b]); } return 0; }

  • ExcelVBAマクロで貼り付け先の配列化について

    ExcelVBAマクロについて確認させてください。 プログラム高速化のために2番目のワークシート貼り付け先範囲を配列化しました。 1番目のワークシートの文字をtrim関数によって前後の空白を除去したうえで2番目のワークシートに貼り付けようとしていますが、空白が除去できていない状況です。 何か原因なのでしょうかm(__)m Sub test() Dim x As Long Dim y As Long Dim x2 As Long Dim y2 As Long Dim a As String Dim Table As Variant '配列化のため '最大列取得 x = Worksheets(1).Cells(1, Columns.Count).End(xlToLeft).Column '最大行取得 y = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row Table = Worksheets(2).Range(Worksheets(2).Cells(1, 1), Worksheets(2).Cells(y, x)) '貼り付け先範囲を配列化 For x2 = 1 To x '最大列 For y2 = 1 To y '最大行 a = Worksheets(1).Cells(y2, x2).Value Table(y2, x2) = Trim(a) 'ワークシート1の値から前後空白を取り除いてワークシート2に貼り付け Next Next End Sub

  • 3次元配列から2次元配列に

    3次元配列のデータを2次元配列に移すにはどのように したらよいのでしょうか.とりあえず下記のように考えてみましたが. data3[500][500][4000]; //3次元配列 data2[500][500]; //2次元配列 for(y=0; y<500; y++) for(x=0; x<500; x++){ for(z=0; z<4000; z++){ data2[y][x] = data3[y][x][z]; } } } これでいいのでしょうか?

  • 関数に配列を渡すときの質問です

    関数に配列を渡したいんですがこのソースが問題ないか見てください。 #include<stdio.h> #define N 10 #define M 20 int sig(int X[],int x); main() { int a[N],b[M],i,x,y; for(i=0 ; i<N ; i++){ a[i]=i; } for(i=0 ; i<M ; i++){ b[i]=i; } x=sig(a,N); y=sig(b,M); } int sig(int Z[],int x){ int i,k; k=0; for(i=0 ; i<x ; i++){ k=k+Z[i]; } return k; } ソースは以上です。 1つのソースの中でa[N]とb[M]のように違う数の 配列があるんですが、その配列全部(0~N-1、0~M-1)とかを足してくれる(シグマ)関数を作りたいんですが、Z[]と配列の数を指定しなくてもちゃんと動いてくれるんでしょうか?関数のほうの int x で配列の数を指定するようにしています。 自分でテストした限りではちゃんと動いているようなんですが、間違ってるようなら指摘お願いします。

  • 動的なハッシュの配列を作成したい

    #お世話になります。最終的には、下記のように配列の順番にハッシュを作成したいのですが、ご教授願えませんでしょうか #!/usr/bin/perl #想定される配列 @array=(0,2,4,6,8,1,3,5,7,9); #下記が最終的に動的に作成したいハッシュの形です。 %List = ( '0' => [ (@array0_n) ], '2' => [ (@array2_n) ], '4' => [ (@array4_n) ], '6' => [ (@array6_n) ], '8' => [ (@array8_n) ], '1' => [ (@array1_n) ], '3' => [ (@array3_n) ], '5' => [ (@array5_n) ], '7' => [ (@array7_n) ], '9' => [ (@array9_n) ], ); $a='array'; $n='_n'; foreach (@array){ #試行錯誤中... print "\@{${a}[$_]{$n}}=@{${a}[$_]{$n}}"; } __END__; お忙しいかとは存じますが、よろしくお願いいたします。

    • ベストアンサー
    • Perl

専門家に質問してみよう