配列で飛び飛びの値を指定してループしたいとき

このQ&Aのポイント
  • 円柱上で、少しねじれたマトリックス状に並んだ測定ポイントを順番に測定するためのスクリプトです。
  • 配列をforで繰り返す際、値が連続する場合は問題ないが、飛び飛びの場合はforeach関数を使用する必要があります。
  • 質問文章では、2行目の列のうち、[0]、[2]、[4]で指定するラインを測定せずにとばして、[1]と、[3]と、[5]で指定するラインだけを測定したいという意図があります。
回答を見る
  • ベストアンサー

配列で飛び飛びの値を指定してループしたいとき

お世話になります。 円柱上で、少しねじれたマトリックス状に並んだ測定ポイントを順番に測定するためのスクリプトです。スクリプトは、Cを使うUWSCというのを使用してそれを介して実行しています。UWSCのサポートサイトを検索しましたがforeachが見つからないので、こちらでお願いしています。 わからないところは、配列をforで繰り返すとき、値が連続する時はオッケーなのですが、飛び飛びだと繰り返しが出来ません(当然でしょうけど・・)。 これはforeachという関数を使うそうですが、学習したての初学者で使い方がわからず困っています。 下の例ではどのようにしたらよいのでしょうか?教えてくださいませ。 ------------------ Dim 配列[3][6],行,列 配列[0][0]="1行目"+"第1ライン" 配列[0][1]="1行目"+"第2ライン" 配列[0][2]="1行目"+"第3ライン" 配列[0][3]="1行目"+"第4ライン" 配列[0][4]="1行目"+"第5ライン" 配列[0][5]="1行目"+"第6ライン" 配列[1][0]="2行目"+"第1ライン" 配列[1][1]="2行目"+"第2ライン" 配列[1][2]="2行目"+"第3ライン" 配列[1][3]="2行目"+"第4ライン" 配列[1][4]="2行目"+"第5ライン" 配列[1][5]="2行目"+"第6ライン" 配列[2][0]="3行目"+"第1ライン" 配列[2][1]="3行目"+"第2ライン" 配列[2][2]="3行目"+"第3ライン" 配列[2][3]="3行目"+"第4ライン" 配列[2][4]="3行目"+"第5ライン" 配列[2][5]="3行目"+"第6ライン" For 行=1 To 1//これは2回目。1回目はFor 行=0 To 0 です。1回目は For 列=1 to 5 で問題なく出来ます。 For 列=1, 3, 5//←??この最後の正しいスクリプトがわかりません。意図は、2行目の列(第1ライン~第6ライン)のうち、[0]、[2]、[4]で指定するライン(第1ライン、第3ライン、第5ライン)を測定せずにとばして、[1]と、[3]と、[5]で指定するラインだけを測定したいのです。 //何でかというと、例えば図のように、第1ライン~第6ラインが真っ直ぐでなく、円筒の裏側にも回り込んでいるので、回り込んだ方は円筒を裏側にしてから測定した方が便利だからです。(図で●はこちら側の測定点、△は裏側の測定点のつもりです。) メインの測定用スクリプト next next ---------------- よろしくお願いします。

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

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

Cの範囲で、汎用的(かつ安直)方法としては、配列を経由するというのがあります。 int loopIndex[] = {0, 1, 2, 5, 6, 7, 9, 10}; for(i = 0; i < sizeof loopInex / sizeof loopIndex[0]; i++) { // loopIndex[i] をインデックスにして処理 } これで、(i は) 0, 1, 2, 3, ... と増えますが loopIndex[i] は、0, 1, 2, 5, 6, 7, 9, 10 (ここまで)と変化します。 実際のインデックスは、配列の初期値として指定できるので、どういうパターンでも実現可能です。 (配列の初期値として、書ける範囲なら)

その他の回答 (2)

  • foomufoomu
  • ベストアンサー率36% (1018/2761)
回答No.2

何をしたいのか、文を読んでもさっぱりなので、No.1のような回答しか付かないのでしょう。 C言語なら、for (大文字は使わない) の文法は for ( 最初に実行する式 , ループの継続判定式(falseになったら終了する) , ループの最後まできたら実行する式 ) ; ですから、1つとびに実行したいなら、「ループの最後まできたら実行する式」を i+=2 のような式にすればよいです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

C には foreach もなければ Dim もないしさらにいえば For 行=1 To 1 なんて書き方もしません.

chy_farm
質問者

補足

そんなことを尋ねてません。間違いならなおしてくれません!それで有益なことを教えてくださいよ。こんな無駄なコメントだけしないでほしいです。

関連するQ&A

  • ループ内で変数を配列に入れる

    関数からの返り値を、1~X回取得したいと考えています。 Msgboxで表示させると以下のソースでRetに返り値が入ってきます。 それを配列に入れることってできないのでしょうか? *****部分に Array()=Ret とやっても、コンパイルエラーで 「配列には当てはまりません」と出てきます。 for i = 1 to X    ID = ID & i   Ret =Kansu(hiki1,ID)    ******************** next i 返り値を個別に変数として使いたい→配列に入れればいいや ・・・という発想が 間違っているのでしょうか? 文字列を分割してその結果を配列に入れて行く、ということはできるのに もっと単純そうなこれが何故できないのでしょう・・・(涙)。 わかりにくい説明ですみませんが、 どなたかわかる方、教えてください。

  • ExcelVBAでの配列処理について

    処理速度向上を目的に配列を利用したいのですが、結果の書きだし処理で悩んでいます。 Dim aa(10000,2) as Double for i = 1 to 10000 for j = 1 to 2 aa(i,j)=Rnd() next j next i 上記の処理で、10000行と2列の乱数表データが配列として出来、そのデータをシートに書き出しするときに、列を2つほど飛ばして書き出したいのですが、どうすればよいのでしょうか? range("A1:B10000") = aa  という連続した列ではなく、A列に1万行、D列に1万行書き出したいと思っています。 処理速度を向上させたいので、またFor分処理するのではなく、一気に書き出したいと思っています。 ご教授のほどよろしくお願い申し上げます。

  • ExcelVBAでデータを一括してセルに貼り付ける

    こんばんは ExcelVBAで教えてください。 配列のデータをセルに貼り付ける方法です。 一つ一つ行う方法は解ります。 しかし、これでは件数が多いと時間がかかってしまいます。 まとめて貼り付ける方法を教えてください。 例えば次のように100列1000行のデータのとき、一つ一つでは10万回も貼り付けることになります。 これを1行単位で1000回とか全部まとめて1回とかでできないでしょうか。 配列データを用意する都合で1行単位もお願いします。 For Row = 1 To 1000 For Column = 1 To 100 Cells(Row, Column).Value = 配列(Row - 1, Column - 1) Next Next

  • エクセルマクロ配列で変数は使えますか

    エクセル2013です。 初めて配列を使います。 以下のように作成し思ったようにできました。 Sub 計算() '成功 Dim a As Integer Dim c As Integer Dim b(5) As Integer Dim 最終行 Dim 値列  値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To 5 b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub ただ計算する列の範囲をインプットボックスで入力した値 にしたい為以下のように改造しました。 Dim b(対象列) As Integerでエラーになります 配列には変数は使用できないのでしょうか? よろしくお願いします。 Sub 計算() '失敗 Dim a As Integer Dim c As Integer Dim b(対象列) As Integer’★ここでERRになる Dim 最終行 Dim 対象列 Dim 値列  対象列 = 22'インプットボックスで入力した値 値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To (対象列 - 17) b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub

  • VBAの配列の格納について

    エクセルのVBAで、セルのデータを配列に格納するスピードを向上したいと思います。 例えば、A1~A10000のセルにデータを書き出す場合、 For 行番号 = 1 To 10000 Cells(行番号, 1).Value = 1 Next よりも、一旦、配列に書き込んだ後、一気にセルに書き込んだ方法が早いのですが、 For 行番号 = 1 To 10000 HAIRETU(行番号, 1) = 1 Next Range("A1:A10000").Value = HAIRETU() 今度は、A1~A10000に書き込んだデータを、再度、配列に格納する場合、 For 行番号 = 1 To 10000 HAIRETU(行番号, 1) = Cells(行番号, 1).Value Next とすると時間がかかるので、 HAIRETU() = Range("A1:A10000").Value というような処理をしたいのですが、うまくいきません。 よい方法がありましたら、ご教授ください。 よろしくお願いします。

  • VBAで、配列のデータをセルに書き戻す方法について

    1000行200列の配列があり、配列の5列目と6列目のデータを、セルの10列目と11列目にすばやく書き戻す方法を教えてください。 (方法1) Dim DATA() As Long ReDim DATA(1 To 1000, 1 To 200) FOR 行番号= 1 TO 1000 CELLS(行番号,10).VALUE = DATA(行番号,5) CELLS(行番号,11).VALUE = DATA(行番号,6) NEXT (方法2) Dim DATA() As Long ReDim DATA(1 To 1000, 1 To 200) Dim WORK1() As Long ReDim WORK1(1 To 1000, 1 To 1) Dim WORK2() As Long ReDim WORK2(1 To 1000, 1 To 1) FOR 行番号= 1 TO 1000 WORK1(行番号,1) = DATA(行番号,5) WORK2(行番号,1) = DATA(行番号,6) NEXT RANGE("J1:J1000").VALUE = WORK1() RANGE("K1:K1000").VALUE = WORK2() (方法1)より(方法2)の方が早いのですが、WORKに貯めるのもめんどうなので、 RANGE("J1:K1000").VALUE = DATA(1,5), DATA(2,5), DATA(3,5),~,DATA(999,6),DATA(1000,6)のようなことができればと思います。 よろしくお願いします。

  • 無名配列にスライスを使いたい。

    無名配列の要素へアクセスする際に、スライスを使いたいのですが どのようにすれば良いのでしょうか? まず、@table を3行×3列のテーブルにみたてて、テーブルを作成します。 my @table; for my $i (0..2){ for my $j (0..2){ $table[$i][$j] = ($i+1)*($j+1); } } foreach (@table){ print "@{$_}\n"; } # 出力結果 # 1 2 3 # 2 4 6 # 3 6 9 # 次に1列目のデータをすべて x にしたいのですが、以下のようにすればできることは理解できました。 foreach my $k (0..2){ $table[$k][0] = x; } # output # x 2 3 # x 4 6 # x 6 9 # ただ、これを以下のようにスライスを使って処理しようとすると・・・ ${@table[0..2]}[0] = x; foreach (@table){ print "@{$_}\n"; } # 出力結果 # 1 2 3 # 2 4 6 # x 6 9 # 明らかに目的とは違ったスクリプトになってしまっているのですが、なぜ上記のような出力になるのでしょうか? また、スライスを使って、一行目のデータをすべてxにする方法が ありましたらご指導くださいませんでしょうか。 長い質問になってしまいましたが、よろしくお願いします。

    • ベストアンサー
    • Perl
  • エクセルVBAの配列について

    エクセルVBAの配列について VBAをはじめたばかりの初心者です。 現在、下記のようにデータを配列の中に入れ、 別シートに書き出そうとしております。 (配列へ読み込むところのみ) Dim 配列(1 To 件数, 1 To 9) As Variant For j =1 To 件数 For i = 2 To L If Cells(i, 2).Value = Tx_month Then For k = 3 To 11 配列(j, k - 2) = Cells(i, k).Value Next k End If Next j,i 現状では、データの最終行のみを「件数」分書き出してしまいます。 jとiのForが重なっているからだと思うのですが、どう書き直したら良いか分かりません。 質問をさせていただくのも初めてなので、分かりづらく恐縮ですが お力添え頂けますと幸いです。 どうぞ宜しくお願い致します。

  • 配列の値を保持しながら要素を追加するには

    通信データを処理するプログラムを作っています 変数strDataにCR区切りのデータがいくつか(個数はそのつど変わります)文字列として入って送られてきて、 それを配列strData1()に入れて、たとえば strData1(r)=strData1(r+1)+strData1(r+2)+strData1(r+3) のような計算をしようと思っています。 strData1 = Split(strData, vbCr) For r = 0 To Ubound(strData)-2 strData1(r) = (CDbl(strData1(r)) + CDbl(strData1(r + 1)) + CDbl(strData1(r + 2)) Next r とすると、配列の最後の2つの要素は何も出てきませんよね。 なので、最後の2つのデータを保持しながら、次に来たstrDataを配列にいれて、For文の計算に戻すことをしたい、 また、strDataが3個以下の場合も考えると、ある一定個数をためてから一気に計算させたほうがいいのかとも思いますが、 For文が終わるとまたすぐに一行目を実行して上書きされてしまうようで、うまい方法がわかりません。 なにかヒントになりそうな考え方だけでもいいので、ご助言お願いします。

  • Excel2002 配列の取得

    いつもお世話になっております。 Excelのデータを行単位で配列に書き換える処理を VBAで記述しています。 '****************************************************** '*** 行のループ処理(見出し行を含まず2行目から) For intCnt = 1 To intRow '*** 列のループ処理 For intCnt2 = 1 To 58  '*** セル範囲を配列変数に格納する varUPDT = wsWS.cells(intCnt, 1).Resize(intCnt, 58).Value  If intCnt2 = 1 Then  varDATA = "('" & varUPDT(intCnt, intCnt2) & "'" Else If varUPDT(intCnt, intCnt2) = Empty Then  varUPDT(intCnt, intCnt2) = 0 Else End If '*** テキスト型の列を指定  If intCnt2 = 2 Then  varDATA = varDATA & ",'" & varUPDT(intCnt, intCnt2) & "'" Else  varDATA = varDATA & "," & varUPDT(intCnt, intCnt2) End If End If Next intCnt2 varDATA = varDATA & ")" Next intCnt '****************************************************** 取得した結果を見ると、なぜか奇数行のみが 取得されています。 行の変数(IntCnt)は1ずつ増えていっているのに不思議です。 間違いをご指摘いただきたく存じます。 どうぞよろしくお願いいたします。