2016-09-21 1 views
0

Я очень новичок в VBA, но мне удалось собрать код, который мне действительно нужен. , но код записывает несколько строк в одну строку. Мне нужно записывать диапазон строк каждую неделю и очищать мастер-лист только указанными столбцами. Вторая проблема - это не запись в следующую доступную строку, когда я нажимаю кнопку макроса 2nd time.please, помогите мне разобраться в этом. вот мой код:Скопируйте диапазон данных и вставьте в лист для записи без перезаписывания и следуйте следующей доступной строке

Option Explicit 
Sub UpdateReport2() 

    Dim historyWks As Worksheet 
    Dim inputWks As Worksheet 
    Dim RngToCopy As Range 
    Dim nextRow As Long 
    Dim oCol As Long 


    Dim myCell As Range 



    Set inputWks = Worksheets("Master Sheet") 
    Set historyWks = Worksheets("report") 

    With historyWks 
     nextRow = .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).Row 
    End With 

    With inputWks 
     Set RngToCopy = Range("a2:j56") 

     If Application.CountA(RngToCopy) <> RngToCopy.Cells.Count Then 
      MsgBox "Please fill in all the cells!" 
      Exit Sub 
     End If 
    End With 

    With historyWks 
     With .Cells(nextRow, "A") 
      .Value = Now 
      .NumberFormat = "dd/mm/yyyy" 
     End With 
     .Cells(nextRow, "B").Value = Application.UserName 
     oCol = 3 
     For Each myCell In RngToCopy.Cells 
      historyWks.Cells(nextRow, oCol).Value = RngToCopy.Value 
      oCol = oCol + 1 
     Next myCell 
    End With 

    'clear input cells that contain constants 
    With inputWks 
     On Error Resume Next 
     With .Range("b2:j56").Cells.SpecialCells(xlCellTypeConstants) 
       .ClearContents 
       Application.GoTo .Cells(1) ', Scroll:=True 
     End With 
     On Error GoTo 0 
    End With 
End Sub 
+0

Один быстрой записки, 'Set RngToCopy = Range ("a2: J56")' пропускает '.' перед тем 'Range()', чтобы связать его с 'inputWks'. Таким образом, 'RngToCopy' всегда будет из' ActiveSheet', что бы это ни было. – BruceWayne

+0

Так как вы новичок в VBA, пытались ли вы пройти через код с помощью F8 и точек разрыва? Вот хороший способ: http://www.excel-easy.com/vba/examples/debugging.html. – CRUTER

+0

Также, что делает 'Application.GoTo .Cells (1)' должен делать? – BruceWayne

ответ

0

У вас было несколько ошибок в коде, который я исправил для вас. Этот код работает для меня. Он берет 10 столбцов данных из «Мастер-листа» и помещает все данные в 1 строку в «отчет». На странице отчета он помещает все в следующую доступную строку. Вопросы, я нашел:

  1. Вы не определить, какой диапазон рабочего листа ваш доносился из когда Установка RngToCopy

  2. В вашем For Loop, вы пытаетесь получить значение всего вашего диапазона. Что следовало бы пойти там был ваш Variant.Value myCell.Value

Примечание: я удалил много вашего With blocks, не потому, что они были неправы, или что-нибудь подобное, просто личные предпочтения. Я оставил заметки в кодах, где были исправлены ошибки.

Option Explicit 
Sub UpdateReport2() 

    Dim historyWks As Worksheet, inputWks As Worksheet 
    Dim RngToCopy As Range, myCell 
    Dim nextRow As Long, oCol As Long 

    Set inputWks = ThisWorkbook.Sheets("Master Sheet") 
    Set historyWks = ThisWorkbook.Sheets("report") 

    nextRow = historyWks.Cells(historyWks.Rows.Count, "C").End(xlUp).Offset(1, 0).Row 

    Set RngToCopy = inputWks.Range("A2:J56") 'assigned the sheet the range comes from 

    If Application.CountA(RngToCopy) <> RngToCopy.Cells.Count Then 
     MsgBox "Please fill in all the cells!", Title:="Missing Data" 
     Exit Sub 
    End If 

    With historyWks.Cells(nextRow, "A") 
     .Value = Now 
     .NumberFormat = "dd/mm/yyyy" 
    End With 

    historyWks.Cells(nextRow, "B").Value = Application.UserName 

    '>>>>>>>>>>>>>>>>>>>THIS IS THE FOR LOOP TO CHANGE<<<<<<<<<<<<<<<<<<<<< 
    oCol = 3 
    For Each myCell In RngToCopy.Cells 
     historyWks.Cells(nextRow, oCol).Value = myCell.Value 'you want the cell value, not range value 
     oCol = oCol + 1 
    Next myCell 
    '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 

    'clear input cells that contain constants 
    On Error Resume Next 
     With inputWks.Range("B2:J56").Cells.SpecialCells(xlCellTypeConstants) 
      .ClearContents 
      Application.GoTo .Cells(1) ', Scroll:=True  
     End With 
    On Error GoTo 0 
End Sub 

Для передачи Master Range в одну строку на запись

oCol = 3 
For Each mycell In RngToCopy.Cells 
    historyWks.Cells(nextRow, oCol).Value = mycell.Value 'you want the cell value, not range value 
    oCol = oCol + 1 
Next mycell 

Для передачи мастер-диапазона для одного столбца на запись

oCol = 3 
For Each mycell In RngToCopy.Cells 
    historyWks.Cells(nextRow, oCol).Value = mycell.Value 'you want the cell value, not range value 
    nextRow = nextRow + 1 
Next mycell 

Для передачи Master Диапазон записи , Смещение по дате и имени пользователя

For Each mycell In RngToCopy.Cells 
    historyWks.Cells(mycell.Row + nextRow - 2, mycell.Column + 2).Value = mycell.Value 'you want the cell value, not range value 
Next mycell 

Для передачи Master Range для записи, столбцов и строк, места

For Each mycell In RngToCopy.Cells 
    historyWks.Cells(mycell.Column + nextRow - 1, mycell.Row + 1).Value = mycell.Value 'you want the cell value, not range value 
Next mycell 
+0

Большое спасибо Tyeler за быстрый ответ, но он все еще записывает весь код в одну строку, но мне хотелось бы, чтобы все 56 строк из мастер-листа записывались каждый день, когда я нажимаю кнопку, следуя записи предыдущего дня. , пожалуйста, напишите мне полный код. Большое спасибо заранее. – senthuran

+0

@senthuran Я не совсем понимаю ваш вопрос. Я обновил свой ответ, чтобы перечислить кучу разных вариантов. Просто замените свою «For Loop» на то, что вам подходит. Может быть, картина того, что вы хотите получить, поможет. – Tyeler

+0

Спасибо Tyeler, ваш диапазон переноса для записи, смещение по дате и имени пользователя работает отлично для меня, но когда я создаю еще одну запись на листе мастера, нажмите кнопку, чтобы записать в «записи» ее перезапись на предыдущей записи. Я хотел использовать следующую доступную пустую строку для записи каждый раз. Пожалуйста, снова просмотрите снимок экрана. – senthuran

Смежные вопросы