Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Excel 2007)
複数ブックのデータコピー方法
投稿日時: 18/11/07 11:53:53
投稿者: FILETUBE

こんにちは。
1つ教えて下さい。
 
SYUKEI,WKM1,WKM2,WKM3の
4つのブックがあります。
 
SYUKEIでボタンをクリックすると 
WKM1,WKM2,WKM3がらデータを取得して
SYUKEIにセットします。
 
SYUKEIはセットする前に見出し行以外はクリアします。
 
データにコピーの部分で
 
   Dim readwb As Workbook
   Dim readwks As Worksheet
   Dim writewks As Worksheet
   'コピー
   Set readwb = Workbooks.Open("C:\test\WKM1.xlsx")
   Set readwks = readwb.Worksheets("入力")
    
   Set writewks = ThisWorkbook.Worksheets(1)
   writewks.Cells(2, 1).Value = readwks.Cells(2, 5).Value
 
とコーディングし1つのセルだけはコピーできるようになりました。
 
SYUKEIのA列にWKM1,WKM3のE列,WKM2のD列
SYUKEIのB列にWKM1,WKM3のH列,WKM2のJ列
SYUKEIのC列にWKM1,WKM3のI列,WKM2のK列
を入力されている最終行までコピーします。
 
WKM1からセットし、セットした最終行からWKM2を、
そしてまたその最終行からWKM3をセットしたいのですが
指定された列の入力されている全行のコピー、SYUKEIへの
最終行へのセット方法がわかる方おられましたら
教えて頂けないでしょうか。
 
どうぞ宜しくお願いします。

回答
投稿日時: 18/11/07 14:55:48
投稿者: sk

引用:
SYUKEIのA列WKM1,WKM3のE列,WKM2のD列
SYUKEIのB列WKM1,WKM3のH列,WKM2のJ列
SYUKEIのC列WKM1,WKM3のI列,WKM2のK列

引用:
指定された列の入力されている全行のコピー、
SYUKEIへの最終行へのセット方法

(標準モジュール)
-------------------------------------------------------------------------------
Sub subAddRecords()
 
    Dim xlsReadBook As Excel.Workbook
    Dim xlsReadSheet As Excel.Worksheet
    Dim xlsReadRange As Excel.Range
    Dim lngReadStartRow As Long
    Dim lngReadLastRow As Long
     
    Dim xlsWriteSheet As Excel.Worksheet
    Dim xlsWriteRange As Excel.Range
    Dim lngWriteStartRow As Long
    Dim lngWriteLastRow As Long
     
    Dim lngColumn As Long
    Dim varColumns As Variant
    Dim varValues As Variant
     
    Set xlsWriteSheet = ThisWorkbook.Worksheets(1)
     
    Set xlsReadBook = Workbooks.Open("C:\test\WKM1.xlsx")
    Set xlsReadSheet = xlsReadBook.Worksheets("入力")
          
    lngReadStartRow = 2
    lngReadLastRow = xlsReadSheet.UsedRange.Rows.Count
     
    If lngReadLastRow >= lngReadStartRow Then
         
        lngWriteStartRow = xlsWriteSheet.UsedRange.Rows.Count + 1
        lngWriteLastRow = lngWriteStartRow + (lngReadLastRow - lngReadStartRow)
             
        varColumns = Array("E", "H", "I")
             
        For lngColumn = LBound(varColumns) To UBound(varColumns)
            With xlsReadSheet
                Set xlsReadRange = .Range(.Cells(lngReadStartRow, varColumns(lngColumn)), _
                                          .Cells(lngReadLastRow, varColumns(lngColumn)))
            End With
                 
            With xlsWriteSheet
                Set xlsWriteRange = .Range(.Cells(lngWriteStartRow, lngColumn + 1), _
                                           .Cells(lngWriteLastRow, lngColumn + 1))
            End With
             
            varValues = xlsReadRange.Value
            xlsWriteRange.Value = varValues
                     
            Set xlsWriteRange = Nothing
            Set xlsReadRange = Nothing
        Next
    End If
 
    Set xlsReadSheet = Nothing
    xlsReadBook.Close False
    Set xlsReadBook = Nothing
 
    Set xlsWriteSheet = Nothing
 
End Sub
-------------------------------------------------------------------------------
 
WKM1.xlsx からデータをコピーする場合は
以上のようなコードを実行なさればよろしいのでは。
 
引用:
SYUKEI,WKM1,WKM2,WKM3
4つのブックがあります。

引用:
SYUKEIのA列にWKM1,WKM3のE列,WKM2のD列
SYUKEIのB列にWKM1,WKM3のH列,WKM2のJ列
SYUKEIのC列にWKM1,WKM3のI列,WKM2のK列

引用:
WKM1からセットし、セットした最終行からWKM2を
そしてまたその最終行からWKM3をセット

WKM2.xlsx と WKM3.xlsx からのコピーに関しても同様。

投稿日時: 18/11/07 15:42:46
投稿者: FILETUBE

大変丁寧な回答ありがとうございます。
 
コピー開始行が30410行目になってしまうのは
何かが残っていて、ブックを作りかえるしかないのでしょうか?

回答
投稿日時: 18/11/07 16:05:35
投稿者: sk

引用:
コピー開始行が30410行目になってしまうのは
何かが残っていて、ブックを作りかえるしかないのでしょうか?

引用:
lngWriteStartRow = xlsWriteSheet.UsedRange.Rows.Count + 1

UsedRange プロパティが返すのは「使用されているセル範囲」への参照です。
 
値が空であっても、書式(表示形式/配置/フォント/罫線/塗りつぶしなど)が
設定されている(されたことがある)セルもその範囲に含まれます。
 
「 A 列において、何らかの値が格納されているセルの最終行」を
取得する場合は、次のように書き換えて下さい。
 
---------------------------------------------------------------------
 
lngWriteStartRow = xlsWriteSheet.Cells(xlsWriteSheet.Rows.Count, "A").End(xlUp).Row + 1
 
---------------------------------------------------------------------
 
引用:
SYUKEIはセットする前に見出し行以外はクリアします。

なお、上記の操作については、私が例示したコードでは実行していません。

投稿日時: 18/11/07 16:28:55
投稿者: FILETUBE

回答ありがとうございます。
なるほどよく分りました。
 
大変丁寧に本当にありがとうございました。
別スレでもう1点お聞きしたい事がありますので
また宜しくお願いします。