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

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

EXCEL VBAコミュのセルの値を配列に取り込み計算する方法をご教授ください.

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめましてこんにちはSIKと申します.
エクセルVBAでセルに入っている値を配列に取り込み
計算させようと下記のようにプログラムを書いたのですが
最初のDO文で無限ループを起こしてしまっています.

VBA初心者のため書き方がまずいのでしょうか?
ググって調べましたがよくわかりませんでした.

みなさま初心者の私にご教授願います.
なお,エクセルのバージョンは2000を使用しております.


'型宣言
Dim I As Integer
Dim Imax As Integer
Dim U() As Variant
Dim upc() As Variant

Imax = 100

'I=1〜Imax の間で配列Uの値はセル(I , 1)の値である
Do While I >= 1 And I <= Imax
ReDim U(Imax -1)
U(I) = Cells(I , 1).Value
Loop

'I=1〜Imax の間で配列upcは配列Uの引き算で計算される
Do While I >= 1 And I <= Imax
ReDim upc(Imax -1)
upc(I) = U(I + 1) - U(I - 1)
Range(Cells(I, 2), Cells(Imxa, 2)).Value = upc
Loop

コメント(7)

これって無限ループを起こしているコード
そのままでしょうか?

このまま実行するとIが初期化されていないため,
ゼロが入るので,Do文の継続条件に一致せず,
Do文は実行されないで終了してしまうのですが...

デバッグ実行してみましたか???

仮に
I=1
という式が入っていたとした場合,
Iをインクリメントしてあげないと
無限ループに入りますね。

'I=1〜Imax の間で配列Uの値はセル(I , 1)の値である
Do While I >= 1 And I <= Imax
  ReDim U(Imax -1)
  U(I) = Cells(I , 1).Value
  I = I + 1
Loop

これだと,Iが100になったときに配列のオーバーフロー
を起こすので,下記の方がいいですね。
そして,Redimを使うときは[Preserve]を入れないと,
前の値が消えてしまうのでこのようにします。

'I=1〜Imax の間で配列Uの値はセル(I , 1)の値である
Do While I >= 1 And I <= Imax
  ReDim Preserve U(Imax)
  U(I) = Cells(I , 1).Value
  I = I + 1
Loop

ちなみに,私が書くならこんな感じで書きます。
Sub test()

  '型宣言
  Dim i As Integer
  Dim iMax As Integer
  Dim U(100) As Integer
  Dim upc(100) As Integer

  iMax = 100

  'i=1〜imax の間で配列Uの値はセル(I , 1)の値である
  For i = 1 To iMax
    U(i) = Cells(i, 1).Value
  Next i

  'i=1〜imax の間で配列upcは配列Uの引き算で計算される
  For i = 1 To iMax - 1
    upc(i) = U(i + 1) - U(i - 1)
    Range(Cells(i, 2), Cells(iMax, 2)).Value = upc(i)
  Next i

End Sub
夕゛イセイ さん
大変ご丁寧な説明どうもありがとうございます.
これをもとに早速試してみたいと思います.
本当にどうもありがとうございました.
Dim U As Variant
U = Range(Cells(1, 1), Cells(iMax, 1)).Value

二次元配列になってしまいますが、配列に入れるだけならこれでも。

>>For i = 1 To iMax - 1
>>  upc(i) = U(i + 1) - U(i - 1)
>>  Range(Cells(i, 2), Cells(iMax, 2)).Value = upc(i)
>>Next i

これってiが1の場合どうなっちゃいます・・・?
To:SIKさん
デバッグ実行しながら一つずつ試してみると
勉強になると思いますよ。
頑張ってください!

って,2番目のループはほとんど見てませんでしたが,
これだとうまくいかなそうですね...

To:ofさん
> 二次元配列になってしまいますが、配列に入れるだけならこれでも。

ああ。そうですね...
素晴らしいです!

> これってiが1の場合どうなっちゃいます・・・?

i=1って初回のループですよね。
動くには動きますが,SIKさんのやりたい結果とは
異なっている気がします(笑)

upcの結果をB列に表示したいのであれば...

'i=1〜imax の間で配列upcは配列Uの引き算で計算される
For i = 1 To iMax - 1
  upc(i) = U(i + 1) - U(i - 1)
  Cells(i, 2).Value = upc(i)
Next i

これで実現可能でしょうか?
例えば、A10:A110のセルの値を配列に取り込み、上下のセルの値の差を配列に突っ込んでから、B10:B110にセットするならこんな感じかと。
  Dim X As Variant
  Dim Z As Variant
  Dim i As Long
  Dim L As Long
  Dim U As Long

  X = Range("A10:A110")
  Z = Range("A10:A110")
  L = LBound(X, 1)
  U = UBound(X, 1)
  Z(L, 1) = X(L + 1, 1)
  Z(U, 1) = -X(U - 1, 1)
  For i = L + 1 To U - 1
    Z(i, 1) = X(i + 1, 1) - X(i - 1, 1)
  Next i
  Range("B10:B110") = Z
皆様私のためにコメントしてくださりどうもありがとうございます.
プログラムは少しかじったことがある程度のスキルしかなく
試行錯誤しながらマクロを組んでおります.

今回はエクセルのセル上の値を配列に取り込む方法と,
取り込んだ配列同士を計算させてエクセルのセルへ表示させる方法が
いまいちよくわからなくて上記のような質問させていただきました.

質問する前に色々サンプルプログラムをネット上で検索したのですが
探し方が悪くかつ理解力が乏しいため
自分が行いたい作業を探すことが出来ませんでした.
また,探しているうちにArray 関数,UBound,LBound 関数などがあることは
わかりましたがよく理解できなませんでした.

しかし皆様のようにご丁寧に指導してくださる方々のおかげで
配列や関数を少し理解することが出来ました.
of さん,夕゛イセイ さん,ビリー さん
ご指導頂き本当にどうもありがとうございました.
すみません。
私のコードの
>  X = Range("A10:A110")
>  Z = Range("A10:A110")
>  Range("B10:B110") = Z

  X = Range("A10:A110").Value
  Z = Range("A10:A110").Value
  Range("B10:B110").Value = Z
としておいてください。

元のままでも同じ結果は得られますが、きちんと意味を理解するにはValueプロパティは書くべきですから。

ログインすると、みんなのコメントがもっと見れるよ

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

EXCEL VBA 更新情報

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

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