Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7133 / 13645 ツリー ←次へ | 前へ→

【40961】配列内での計算 Fire 06/7/26(水) 22:15 質問[未読]
【40963】Re:配列内での計算 [名前なし] 06/7/27(木) 0:19 回答[未読]
【40966】Re:配列内での計算 だるま 06/7/27(木) 8:59 回答[未読]
【41018】Re:配列内での計算 Fire 06/7/27(木) 18:56 お礼[未読]

【40961】配列内での計算
質問  Fire  - 06/7/26(水) 22:15 -

引用なし
パスワード
   初心者です。

VBA本によりますと、配列内で使える関数というものは5,6個しか用意されてなく、その内容も配列の最小最大数とからしいです。
以下のようなコードで、選択した領域の小数点以下何桁かある数値を丸めて新しい
シートに転記したいのですが、可能でしょうか?
なんと表現したらよいか用語に自信がありませんが、Rangeで所得した配列は1から始まるそうなので1から書いてみました。
領域は3列1000行くらいになり、数値以外にはブランク、「−」が入る可能性があります。転記先も3×1000となります。
書籍には1から始まる配列でこのような処理はできないらしい記述があったので0からのコードがいいかもしれませんが、。。。
よろしくおねがいします。


sub 計算()

 selection=Range(・・・)
  For i=1 to Selection.Count 
   Redim 領域(i)
     領域(i)=関数(Selection.Cells(i))
  Next i
 新しいシート=領域()
End sub

Private Fanctin 関数

四捨五入ができる処理

End Function

【40963】Re:配列内での計算
回答  [名前なし]  - 06/7/27(木) 0:19 -

引用なし
パスワード
   こんな感じでしょうか。

Sub Macro1()

Const InputSheet = "Sheet1" '出力先シート名
Const OutputSheet = "Sheet2" '出力先シート名
Const ColCnt = 3       '処理する列数

Dim V As Variant       '配列保管用
Dim i As Long, j As Long   'ループカウンタ・その他
Dim MaxRow As Long      '最大行数

  With Worksheets(InputSheet)
    '-- 各列の最終行で、最大のものを取得 --
    For i = 1 To ColCnt
      j = .Cells(Rows.Count, i).End(xlUp).Row
      MaxRow = IIf(MaxRow < j, j, MaxRow)
    Next
  
    '-- セルの値を配列に取得 --
    V = .Range("A1").Resize(MaxRow, ColCnt).Value
  End With
  
  '-- 配列内の数値を四捨五入 --
  For i = 1 To ColCnt
    For j = 1 To MaxRow
      If IsNumeric(V(j, i)) Then V(j, i) = Round(V(j, i))
    Next
  Next

  '-- 配列の値をセルに転記 --
  Worksheets(OutputSheet).Range("A1").Resize(MaxRow, ColCnt).Value = V

End Sub

【40966】Re:配列内での計算
回答  だるま WEB  - 06/7/27(木) 8:59 -

引用なし
パスワード
   配列内でなく、セルに貼り付けた後でワークシート関数を適用ではだめでしょうか。^d^

Sub test()
  Dim R As Range
  Selection.Copy
  With Worksheets.Add
    .Paste
    Application.CutCopyMode = False
    For Each R In .UsedRange
      If R.Value = "" Or Not IsNumeric(R.Value) Then
      Else
        R.Value = Application.WorksheetFunction.Round(R.Value, 0)
      End If
    Next
  End With
End Sub

【41018】Re:配列内での計算
お礼  Fire  - 06/7/27(木) 18:56 -

引用なし
パスワード
   ありがとうございました。
ボクの作ったものは3,4分かかってましたが、上記マクロでなら瞬時に希望通りのことができました。
また、いままでワークシート関数でやっていたのですが、ファイルが8Mくらいになるし、いちいち再計算(これも1分くらいかかる)されてしまい、マクロ化に踏み切ったしだいです。アドバイスありがとうです。

7133 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free