40626


taguti 52  
のように名前を１列目、スコアを2列目にしました。一応できたのですがnext縛りというかなんというか、for文で数字だけとって、foreachで要素をとりたかったです。

[code]

    sub name_score()
      dim names as variant
      names = array("taguti", "fkoji", "sugimoto", "tanaka", "higasi", "sajio", "kojima", "midori", "kobayasi")
      dim scores as variant
      scores = array(52,82,99,32,48,62,72,58,59)
      for i = 0 to 8
        cells(i + 1, 1).value = names(i)
        cells(i + 1, 2).value = scores(i)
      next i
    end sub
    
[/code]

[code]

    ###pythonのイメージ###
    for i in range(1, 9):
        for name in names:
            cells(i, 1).value = name
    
[/code]

pythonみたいな二重ループはVBAではできないのでしょうか？


CC BY-SA 3.0
2017-12-28T02:35:33.130
40575
2017-12-30T10:45:10.727
2017-12-28T08:04:02.930
19110
26076
question
vba
VBAは二重ループがつかえないのでしょうか？


VBA でも二重ループは使えます。

誤解なさっている点が複数ありそうなので、1つずつ説明します。

## For...Next ループは二重にできる

For...Next ループで使うカウンタの名前を変えれば、ループをネストさせることができます。  
以下のコードは、九九表を作ります。

[code]

    Sub Main
      For i = 1 To 9
        For j = 1 To 9
          Cells(i, j).Value = i * j
        Next j
      Next i
    End Sub
    
[/code]

## VBA にも foreach ループはある

For Each...Next ステートメントを使えば foreach ループができます。  
以下のコードは、配列 `rows` に格納された整数 `row` に対して、A 列 `row` 行のセルの内容を `"XXX"` にします。

[code]

    Sub Main
      Dim rows(5) As Integer
      rows = Array(3, 9, 2, 8, 5)
      For Each row In rows
        Cells(row, 1).Value = "XXX"
      Next row
    End Sub
    
[/code]

## ループの種類が違ってもネストできる

他のプログラミング言語と同じように、For...Next ループの中に For Each...Next ループを入れ子にしたりできます。

## 質問文中のプログラムで実装しようとしている動作は、一重ループで書くべき

ご質問のプログラムで実装しようとなさっている動作は「長さが同じ2つの一次元配列 `names`, `scores` が与えられる。`names` の内容を
A 列に、`scores` の内容を B 列に展開せよ」ということだと思います。

これは一次元データを一次元的に扱えば解決できる内容なので、ネストの無いループで実現できますし、そうすべきです。

**補足** : もし `names` の長さが分からないということであれば、For Each...Next
ループを使う際にカウンタ変数を作ってあげれば良いと思います。

[code]

    Sub Main
      Dim names() As Integer
      ReDim names(5)
      names = Array("A", "B", "C", "D", "E")
      Dim i As Integer
      i = 1
      For Each name In names
        Cells(i, 1).Value = name
        i = i + 1
      Next name
    End Sub
    
[/code]


CC BY-SA 3.0
2017-12-30T10:45:10.727
40626
2017-12-30T10:45:10.727
19110
40575
answer