ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

EXCEL VBAコミュの100行×100列の範囲に1から順に値を入れる

  • mixiチェック
  • このエントリーをはてなブックマークに追加
皆様、初めまして、新型ヲタクスティーロと申します。
今回は質問がありトピックを立てさせていただいた次第です。

現在、VBAに興味があり、自分でタイトルの通りの
課題を設定して作っている状況です。

以下、自分の作業環境と希望する動作を書きます。


【作業環境】

・OS:Windows 7 Professional Edt (x64)

・使用ソフト:Microsoft Excel 2010 (ver.14.0)

【やりたい動作】
・セルA1を左上とし、100列×100行の範囲でA1から右へ順に
 1〜10000まで値を入れる。

・100カウントするごとに下の行に移動し、その行の
 A列から右に順に値を入れていく
 (A1の値:1、A2の値:101、A3の値:201のように)

・最終的に10000までカウントしてそこで終了させる。
 (セルCV100の値が10000になる)

・Do whileやFor文でループさせたい。

【今現在自分が書いているコード】
-------------------------------------------------
Sub LoopNest()

Dim a, b, i As Integer
a = 0

For i = 1 To 10000
a = a + 1

If a <= 100 Then
Range("A1").Activate
ActiveCell.Cells(1, i).Value = a

Else
If a <= 200 Then
        Range("A2").Activate
ActiveCell.Cells(2, i).Value = a

Else

End If

End If



Next i
End Sub

-----------------------------------------------------

【困っていること】
掲載した写真の赤丸の箇所のように、カウントした値は
入れられているが、100カウントして下の行に移動した際
A2に値が入れられない。


非常に簡単な構文であると、知り合いからは言われてしまいましたが
どなたか解決策をご教授願えないでしょうか。

この質問に関して、適切なトピックがあるようでしたら
こちらを削除してそちらで質問いたしますのでお教え願います。

コメント(21)

Sub LoopNest() の名前の通りに
Loopをネストしてあげるのが普通。


For i=0 To 99

For j=0 To 99

NEXT j

NEXT i
ステップイン、ブレイクポイントを使えば動きがわかるし、力も付きますよ指でOK
現状のコードを生かすのであれば、例えば
Sub LoopNest1()
Dim a, i As Integer
a = 0
For i = 1 To 10000
  If i Mod 100 = 1 Then
    a = a + 1
  End If
  Cells(a, (i - 1) Mod 100 + 1) = i
Next i
End Sub
Sub LoopNest2()
Dim a, i As Integer
a = 0
For i = 1 To 10000
  If i Mod 100 = 1 Then
    a = a + 1
  End If
  Range("A" & a).Activate
  ActiveCell.Cells(1, ((i - 1) Mod 100) + 1).Value = i
Next i
End Sub
こんな感じでしょうか

私がやるなら、For文をネストして
Sub Macro1()
For i = 1 To 100
  For j = 1 To 100
    Cells(i, j) = (i - 1) * 100 + j
  Next j
Next i
End Sub

もしくは、行数を省きたいときは
Sub Macro2()
For i = 1 To 10000
  Cells(Int((i - 1) / 100) + 1, ((i - 1) Mod 100) + 1) = i
Next i
End Sub
>タナカ様
回答いただきありがとうございます。

やはりアドバイスいただいた通りに
書くことが一番なようです。

今も色々と試行錯誤しておりますが
解決の糸口にすることが出来そうです。
ありがとうございました。
>Tammy様
回答いただきありがとうございます。

アドバイスいただいた件について
やってはいたんですが、何分自分の
書いたコードがめちゃくちゃだったうえに
私の理解も浅かったので役に立っていませんでした(汗)

他の方からもアドバイスいただいたように
コードを書いたうえでステップインなどを使うと
かなり理解につながりました(笑)

わざわざ回答ありがとうございました。
私ならこうかな。。


Dim Rng, R as Range
Dim i as long

Set Rng = Range(Cells(1), Cells(100, 100))

For each R in Rng
i = i + 1
R.value = i
Next


素早く動かしたいなら、

Dim Rng as Range
Dim v as Variant
Dim i, j as long

Set Rng = Range(Cells(1), Cells(100, 100))
v = Rng

For i = 1 to 100
For j = 1 to 100
v(i, j) = (j - 1) * 100 + i
Next
Next

Rng = v


とかでどうでしょう。
ソラで書き込んでいるので間違ってたらごめんなさい。。
>マリ男様
回答いただきありがとうございます。

私の書いたコードを活かしての補足、並びに別のパターンまで
ご教授いただき大変参考になりました。
一つ一つじっくりと読ませていただいております。

一つの目的に対して色々とコードがあるのは非常におもしろいですね。

状況や目的に応じて、きれいなコードが書けるよう精進します!
>Tana☆Pippi様
回答いただきありがとうございます。

自分はまだどの構文がどう動くかを完全に理解していないのと
変数の使い方もまだまだ完全に理解できていないです(汗)

おっしゃられた通り、iがどのように動いているのか
しっかりと理解するように努めます。

アドバイスありがとうございました。
>こじゅ (Lucy inside) 様
いえいえw乗り遅れとかいうのはないですよw

ご教授いただいたコードは非常に参考になるものばかりでしたので
ただただ感謝するしかありません。

こじゅ様のコメントもまだすべて見きれていませんが
勉強の参考にさせていただきます。

わざわざありがとうございます。
やりたいことを日本語で考えて、聞いて見るのもイイと思います。

今回の例題だったら、
列カウンターに1足していって、
列カウンターが100になったら、
行カウンターに1足して、列カウンターを1にする。

かな?

色んなテクニックや構文があるけど、
見た目にこだわらず作ってみて、
ステップインで一つずつ動かしてみたてください。
なにかレスのタイミングがかぶったのでついあっかんべー
課題があって、みんなで考えるってなんか楽しいですね〜


> Sedvicious さん

あれ? このコードで Option Base 1 の宣言って要ります?
Variant 型配列のサイズを指定するかわりに一回セルから直接貼ってるので、配列も普通に Cells と同じ 1〜 の連番になってるはず。。。

自宅には Excel ないのですぐ検証できないですがあせあせ(飛び散る汗)

DataSeries ってはじめて見ました、来週試してみますほっとした顔
> Sedvicious さん

間違ってなければよかったですあせあせ
配列変数は個人的に頻繁に使うんですけど、Option Base 1 を書くことは最近滅多になかったので正直存在を忘れてました(笑)
これが最速!と思うんですけどどうでしょう?

Dim i As Long
Dim j As Long
Dim n As Long
Dim a(1 To 100, 1 To 100) As Long

For i = 1 To 100
For j = 1 To 100
n = n + 1
a(i, j) = n
Next
Next

Range("A1").Resize(UBound(a, 1), UBound(a, 2)) = a
> ミスキタさん

4行目の配列宣言にはビツクリexclamationexclamation( ̄□ ̄;)

そんな荒技があるとは…
みなさんすごく難しく書いていますが
これではだめなんでしょうか?

Sub Macro2()
Dim i As Long

Range(Cells(1, 1), Cells(100, 100)).Select

For i = 1 To Selection.Count
Selection.Cells(i) = i
Next

End Sub
>喜喜さん

それでも動きますけど、ものすごく遅いですよね。
あと、セルの範囲が選択されてしまうのも気持ち悪いです。
途中で止まったときに選択範囲を変えられてしまうと誤動作するということも考えられます。
せめて以下のように修正したほうがいいと思います。

Sub Macro2()
Dim i As Long
Dim myR As Range

Set myR = Range(Cells(1, 1), Cells(100, 100))

For i = 1 To myR.Count
  myR.Cells(i) = i
Next

End Sub

ログインすると、残り4件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

EXCEL VBA 更新情報

EXCEL VBAのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。