2012年2月11日土曜日

vba データベース用シートへ別シートのデータを追加する

Option Explicit

'----モジュール内で使用できる変数を宣言
Dim registSh As Worksheet
Dim dataSh As Worksheet
Dim registLastRow As Long, dataLastRow As Long
Dim registHeadRow As Long, rngHeight As Long
Dim lastColumn

'----registシートから複数行のデータをdatabaseシートの最終行より後に転記する
'registシートはA10~E10セル(10行目)が見出しで
'databaseシートはA1~E1セル(1行目)が見出し(順序は同一)
'例) A          B           C         D            E
'|氏名|生年月日|年齢|郵便番号|住所|


Sub データベースへ追加()

Dim rng As Range'データ転記する範囲

Set registSh = Nothing
Set dataSh = Nothing

Set registSh = ThisWorkbook.Worksheets("regist")
Set dataSh = ThisWorkbook.Worksheets("database")

registHeadRow = 0
registHeadRow = registSh.Range("A10").Row'見出しセルを指定する
lastCol  = 5'最終列(E列:5列目)

'dataシートの
With dataSh

   dataLastRow = 0
   dataLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row ' (一列目の) 最終行を取得

End With

'registシートの
With registSh

    'rngの行数(rngHeight)を算出
    registLastRow = 0
    registLastRow = .Cells(Rows.Count, 1).End(xlUp).Row
    rngHeight = 0
    rngHeight = registLastRow - registHeadRow'最終行-見出し行

    If registLastRow = registHeadRow Then'registシートにデータがない場合
        '何もしない
    Else
        
         '転記
'〈1〉dataシートの1列目最終行から
'〈2〉下へ1行移動(Offset)して、
         '〈3〉そこからregistシートにあるデータの行数,列数まで広げる(resize)
'dataシートにregistシートの値を代入する dataSh.Cells(~).Value = registSh.Cells(~).Value
'複数セルの値の代入のときは.Valueを省略出来ない

       dataSh.Cells(dataLastRow, 1) _'----〈1〉
         .Offset(1, 0).Resize(rngHeight, lastCol).Value _'----〈2〉〈3〉
          = .Range(registHeadRow,1).Offset(1, 0).Resize(rngHeight, lastCol).Value
         
    End If
End With

End Sub