Макрос импорта данных добавить новый столбец - PullRequest
0 голосов
/ 11 марта 2020

Я довольно новичок в использовании макросов в Excel

Я в основном создал мастер-лист, который будет собирать всю информацию, введенную в форму. Как только человек заполняет форму, ему нужно будет импортировать эту форму на главный лист (главный лист соберет все записи).

Каждый раз, когда новый пользователь импортирует данные, я хочу, чтобы мастер-лист мог иметь новые столбцы на основе вновь импортированных данных.

Я сделал следующее:

Sub Get_Data_From_File()

Dim FileToOpen As Variant
Dim OpenBook As Workbook
Application.ScreenUpdating = False

FileToOpen = Application.GetOpenFilename(Title:="Browse for your File & Import", FileFilter:="Excel Files(*.xls*),*xls*")
If FileToOpen <> False Then
    Set OpenBook = Application.Workbooks.Open(FileToOpen)
    OpenBook.Sheets(1).Range("C6:C12").Copy
    ThisWorkbook.Worksheets("WW_MASTER").Range("e7").PasteSpecial
    OpenBook.Sheets(1).Range("g16:g29").Copy
    ThisWorkbook.Worksheets("WW_MASTER").Range("e16").PasteSpecial
    OpenBook.Sheets(2).Range("o19:o24").Copy
    ThisWorkbook.Worksheets("WW_MASTER").Range("e33").PasteSpecial
    OpenBook.Sheets(2).Range("o29:o32").Copy
    ThisWorkbook.Worksheets("WW_MASTER").Range("e40").PasteSpecial
    OpenBook.Sheets(2).Range("o36:o45").Copy
    ThisWorkbook.Worksheets("WW_MASTER").Range("e45").PasteSpecial
    OpenBook.Sheets(2).Range("c34:c36").Copy
    ThisWorkbook.Worksheets("WW_MASTER").Range("e58").PasteSpecial
    OpenBook.Sheets(2).Range("c38:c40").Copy
    ThisWorkbook.Worksheets("WW_MASTER").Range("e62").PasteSpecial
    OpenBook.Sheets(2).Range("c42:c44").Copy
    ThisWorkbook.Worksheets("WW_MASTER").Range("e66").PasteSpecial
    OpenBook.Sheets(2).Range("c50:c52").Copy
    ThisWorkbook.Worksheets("WW_MASTER").Range("e72").PasteSpecial
    OpenBook.Sheets(2).Range("c54:c56").Copy
    ThisWorkbook.Worksheets("WW_MASTER").Range("e76").PasteSpecial
    OpenBook.Sheets(2).Range("o50:o54").Copy
    ThisWorkbook.Worksheets("WW_MASTER").Range("e81").PasteSpecial
    OpenBook.Close False

End If

Application.ScreenUpdating = True

End Sub

Это просто импортирует первые данные ... однако, когда я импортирую второй файл, он перезаписывает запись.

Пожалуйста, не могли бы вы помочь мне и объяснить как можно яснее, какой код я могу использовать для добавления новые записи

К вашему сведению:

Мастер лист Я хочу, чтобы он выглядел следующим образом

  A       B       C      
5:NAME| SURNAME| DOB
6:LUCY| BELLS| 15/02/1980
7:CHARLOTTE|JULIE|15/02/1980
8:LUKE|WELIS|15/02/1980

Спасибо,

1 Ответ

0 голосов
/ 12 марта 2020

Как сказал БигБен, вам нужно найти пустой конечный столбец. Это можно сделать в VBA, используя

ColumnNumber = ws.Cells(7, Columns.Count).End(xlToLeft).Column + 1

, что аналогично нажатию клавиши Ctrl-Left в ячейке XFD7. Взгляните на With .. End With blocks, чтобы избежать повторения названия объектов. Массивы также могут быть полезны, например -

Option Explicit
Sub Get_Data_From_File()

    Const SHEET_NAME = "WW_MASTER"

    Dim wb As Workbook, ws As Worksheet
    Dim wbForm As Workbook, wsForm As Worksheet
    Dim sFilename As String, map As Variant
    Dim iTargetCol As Integer, t0 As Single, msg As String

    Set wb = ThisWorkbook
    Set ws = wb.Sheets(SHEET_NAME)
    iTargetCol = ws.Cells(7, Columns.Count).End(xlToLeft).Column + 1

    sFilename = Application.GetOpenFilename(Title:="Browse for your File & Import", _
                           FileFilter:="Excel Files(*.xls*),*xls*")

    If sFilename = "False" Then
       MsgBox "No file selected", vbCritical
    End If

    ' master row, form range, form sheet
    map = Array( _
        7, "C6:C12", 1, _
        16, "G16:G29", 1, _
        33, "O19:O24", 2, _
        40, "O29:O32", 2, _
        45, "C36:C45", 2, _
        58, "C34:C36", 2, _
        62, "C38:C40", 2, _
        66, "C42:C44", 2, _
        72, "C50:C52", 2, _
        76, "C54:C56", 2, _
        81, "O50:O54", 2)

    Application.ScreenUpdating = False
    t0 = Timer

    ' copy using mapping rules
    Dim i As Integer, n As Integer

    Set wbForm = Workbooks.Open(sFilename, False, True) ' read only
    For i = LBound(map) To UBound(map) Step 3
        n = map(i + 2) ' sheet no
        wbForm.Sheets(n).Range(map(i + 1)).Copy
        ws.Cells(map(i), iTargetCol).PasteSpecial
    Next
    Application.CutCopyMode = False
    wbForm.Close False

    ' end
    Application.ScreenUpdating = True
    msg = "Imported into column " & iTargetCol & vbCrLf & _
          "From " & sFilename
    MsgBox msg, vbInformation, "Finished in " & Format(Timer - t0, "0.00") & " secs"

End Sub

Или импортировать в один ряд

Sub Get_Data_From_File2()

    Const SHEET_NAME = "Sheet1" '"WW_MASTER"

    Dim wb As Workbook, ws As Worksheet
    Dim wbForm As Workbook, wsForm As Worksheet
    Dim sFilename As String, map As Variant
    Dim iTargetRow As Long, t0 As Single, msg As String

    Set wb = ThisWorkbook
    Set ws = wb.Sheets(SHEET_NAME)
    iTargetRow = ws.Cells(Rows.Count, 1).End(xlUp).Row + 1

    sFilename = Application.GetOpenFilename(Title:="Browse for your File & Import", _
                           FileFilter:="Excel Files(*.xls*),*xls*")

    If sFilename = "False" Then
       MsgBox "No file selected", vbCritical
    End If

    ' master row, form range, form sheet
    map = Array( _
        1, "D6", 1, _
        2, "C8:C14", 1, _
        9, "O19:O24", 2)
    '    40, "O29:O32", 2, _
    '    45, "C36:C45", 2, _
    '    58, "C34:C36", 2, _
    '    62, "C38:C40", 2, _
    '    66, "C42:C44", 2, _
    '    72, "C50:C52", 2, _
    '    76, "C54:C56", 2, _
    '    81, "O50:O54", 2)

    Application.ScreenUpdating = False
    t0 = Timer

    ' copy using mapping rules
    Dim i As Integer, n As Integer, k As Integer, var As Variant, rng As Range

    Set wbForm = Workbooks.Open(sFilename, False, True) ' read only
    For i = LBound(map) To UBound(map) Step 3
        n = map(i + 2) ' sheet no
        Set rng = wbForm.Sheets(n).Range(map(i + 1))
        If rng.Rows.Count = 1 Then
            ws.Cells(iTargetRow, map(i)) = rng.Value
        Else
            var = WorksheetFunction.Transpose(rng)
            ' fill columns
            For k = LBound(var) To UBound(var)
               ws.Cells(iTargetRow, map(i) + k - 1) = var(k)
            Next
        End If
    Next
    Application.CutCopyMode = False
    wbForm.Close False

    ' end
    Application.ScreenUpdating = True
    msg = "Imported into Row " & iTargetRow & vbCrLf & _
          "From " & sFilename
    MsgBox msg, vbInformation, "Finished in " & Format(Timer - t0, "0.00") & " secs"

End Sub

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...