人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

VBAで、ある列に入力されている数値の平均値を求めるコードを教えてください。
Sheet2には、A列とB列に同じ行数、2行目から数値が入力されています。何行入力されているかは、場合によって異なります。そのSheet2の値をSheet3の右端の列にコピペしていくコードを以下のように書いています。

Dim i
i = Sheet3.Cells(1, Columns.Count).End(xlToLeft).Column
If Sheet3.Cells(1, i).Value <> "" Then i = i + 1 'A1が空白ならiを1とする

Sheet2.Range("A1").CurrentRegion.Copy 'Sheet2のデータをコピー
'Sheet3に貼りつけ
Sheet3.Cells(1, i).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Sheet2.Cells.Clear '記録用シートの初期化

ここでSheet3に貼りつけた数値の右側の列の値を、2行目から、入力されている最後の行まで平均し、右側の列の1行目に入力したいと考えています。どのように、コードを書いたら良いか教えてください。

分かりにくい説明で申し訳ありませんがよろしくお願いいたします。

1527772083
●拡大する

●質問者: サク
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● Z1000S
●100ポイント ベストアンサー

こういう事でしょうか?

Public Sub sample()

 Dim i
 i = Sheet3.Cells(1, Columns.Count).End(xlToLeft).Column
 If Sheet3.Cells(1, i).Value <> "" Then i = i + 1 'A1が空白ならiを1とする

 Sheet2.Range("A1").CurrentRegion.Copy 'Sheet2のデータをコピー
  'Sheet3に貼りつけ
 Sheet3.Cells(1, i).PasteSpecial Paste:=xlPasteValues, _
 Operation:=xlNone, SkipBlanks:=False, Transpose:=False
 Sheet2.Cells.Clear '記録用シートの初期化

 Call getAverage(i)

End Sub

Private Sub getAverage(ByVal lBeginCol As Long)

 Const TARGET_SHEET_NAME As String = "Sheet3"

 Const COL_OFFSET As Long = 2

 Dim sHeader As String
 Dim lCol As Long
 Dim lEndRow As Long
 Dim lTargetCol As Long

 lCol = lBeginCol

 With ThisWorkbook.Worksheets(TARGET_SHEET_NAME)
 sHeader = .Cells(1, lCol).Value

 Do Until sHeader = ""
 lEndRow = .Cells(1, lCol).End(xlDown).Row

 lTargetCol = lCol + 1

 .Cells(1, lTargetCol).Value = WorksheetFunction.Average(.Range(.Cells(2, lTargetCol), .Cells(lEndRow, lTargetCol)))

 lCol = lCol + COL_OFFSET

 sHeader = .Cells(1, lCol).Value
 Loop
 End With

End Sub

サクさんのコメント
す・・・すごいです。 完璧に望んでいた処理が実行されています。 変数やコードの意味を、きちんと読ませていただいて理解したいと思います!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ