Перенос данных из одной рабочей книги в другую рабочую книгу ежедневно в определенные / пустые ячейки

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

Мне нужно, чтобы данные были извлечены в определенные ячейки, потому что, если я использую функции пустых строк, у меня есть формулы в конце моих строк и в нижней части столбцов, поэтому я пытаюсь ввести данные в определенные ячейки

Я думаю, что я на правильном пути, но у меня постоянно есть Run-time error '1004': о том, select method of range class failed,

Заранее спасибо, Андерсон

'Next the transfers of the data from the daily quality activity to the specific worksheet of the unit charts'
'Accesories'
Set myData = Workbooks.Open("C:\database\Extractdata.xlsm")
Worksheets("ACC").Select

Dim sourceCol As Integer, rowCount As Integer, currentRow As Integer
    Dim currentRowValue As String

    sourceCol = 1   'column A has a value of 1
    rowCount = Cells(Rows.Count, sourceCol).End(xlUp).Row

    'for every row, find the first blank cell and select it
    For currentRow = 3 To rowCount
        currentRowValue = Cells(currentRow, sourceCol).Value
        If IsEmpty(currentRowValue) Or currentRowValue = "" Then
            Cells(currentRow, sourceCol).Select
        End If
    Next

With Worksheets("ACC").Range("A3")
.Offset(ColumnCount, 0) = currentDate
.Offset(ColumnCount, 1) = devicesStockedACC
.Offset(ColumnCount, 2) = qipAttemptsACC
.Offset(ColumnCount, 3) = qipncproductCountACC
.Offset(ColumnCount, 4) = totalqcncCountACC
.Offset(ColumnCount, 5) = devicencidCountACC
.Offset(ColumnCount, 6) = componentncidCountACC
End With



NEW CODE 3/13/14


Dim currentDate As String

Dim devicesStockedACC As String
Dim qipAttemptsACC As String
Dim qipncproductCountACC As String
Dim totalqcncCountACC As String
Dim devicencidCountACC As String
Dim componentncidCountACC As String

'Acessories'
Worksheets("tuesday").Select
currentDateACC = Range("A1")
Worksheets("tuesday").Select
devicesStockedACC = Range("C12")
Worksheets("tuesday").Select
qipAttemptsACC = Range("D12")
Worksheets("tuesday").Select
qipncproductCountACC = Range("E12")
Worksheets("tuesday").Select
totalqcncCountACC = Range("H12")
Worksheets("tuesday").Select
devicencidCountACC = Range("L12")
Worksheets("tuesday").Select
componentncidCountACC = Range("M12")


'Next the transfers of the data from the daily quality activity to the specific worksheet of the unit charts'
'Accesories'
Set myData = Workbooks.Open("C:\database\Extractdata.xlsm")
Worksheets("ACC").Select
Worksheets("ACC").Range("A3").Select

Application.Run "Selectfirstblankcell"



Sheets("ACC").Activate

With Worksheets("ACC").Range(ActiveCell)
.Offset(ColumnCount, 0) = currentDate
.Offset(ColumnCount, 1) = devicesStockedACC
.Offset(ColumnCount, 2) = qipAttemptsACC
.Offset(ColumnCount, 3) = qipncproductCountACC
.Offset(ColumnCount, 4) = totalqcncCountACC
.Offset(ColumnCount, 5) = devicencidCountACC
.Offset(ColumnCount, 6) = componentncidCountACC
.Offset(ColumnCount, 8) = currentDate
.Offset(ColumnCount, 15) = currentDate
End With



Application.Run "Selectfirstblankcell" = 

Public Sub SelectFirstBlankCell()
    Dim sourceCol As Integer, rowCount As Integer, currentRow As Integer
    Dim currentRowValue As String

    sourceCol = 1   'column F has a value of 6
    rowCount = Cells(Rows.Count, sourceCol).End(xlUp).Row

    'for every row, find the first blank cell and select it
    For currentRow = 3 To rowCount
    For currentCol = 1 To ColCount
        currentCellValue = Cells(currentRow, currentCol).FormulaR1C1
        If IsEmpty(currentCellValue) Or currentCellValue = "" Then
            Cells(currentRow, currentCol).Select 'do something else than select maybe?
            'put code here to handle the empty cell
            Exit For 'this will exit the inner loop, so it will only process the first blank cell on each row
        End If
    Next
Next
End Sub

1 ответ

Попробуйте использовать .formulaR1C1 вместо .value, Ваш текущий код должен работать до первой пустой ячейки в sourceCol

For currentRow = 3 To rowCount
    currentRowValue = Cells(currentRow, sourceCol).formulaR1C1
    If IsEmpty(currentRowValue) Or currentRowValue = "" Then 
        Cells(currentRow, sourceCol).Select
    End If
Next

ваш код выше (я изменил с .value в .formular1C1) будет проходить по каждой строке в sourceCol, и оператор if будет true, если текущая ячейка пуста. чтобы пройти через каждую ячейку (столбец) в каждой строке, вам понадобится еще один цикл for. 1 за спуск, 1 за прохождение

For currentRow = 3 To rowCount
    for currentCol = 1 to ColCount
        currentCellValue = Cells(currentRow, currentCol).formulaR1C1
        If IsEmpty(currentCellValue) Or currentCellValue = "" Then 
            Cells(currentRow, currentCol).Select 'do something else than select maybe?
            'put code here to handle the empty cell
            exit for 'this will exit the inner loop, so it will only process the first blank cell on each row
        End If
    next
Next

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

Дайте мне знать, как это работает для вас

редактировать

после строки: rowCount = Cells(Rows.Count, sourceCol).End(xlUp).Row

Добавь это: colCount = Cells.find("*", [A1], , , xlByColumns, xlPrevious).column

когда вы используете отладчик, вы можете видеть значения всех ваших локальных переменных. поэтому, когда такие вещи происходят, когда они просто ничего не делают, убедитесь, что вы проверяете, что они инициализируются.

извините, что не включил это. теперь внутренний цикл должен работать.

также в аксессуарах это: Worksheets("tuesday").Select нужно только один раз включить в верхней части раздела аксессуаров. делая это: DevicesStockedAcc = Range("A1") не отменяет выбор листа, поэтому вам не нужно каждый раз выбирать его снова.

Также я заметил при настройке аксессуаров, которые вы делаете: currentDateACC = Range("A1") я также заметил переменную: currentDateACC у вас есть как строка. так должна ли эта переменная представлять значение ячейки? или сама клетка? используя только .range вы получите ссылку на диапазон, а не значение в ячейке. чтобы получить значение используйте: devicesStockedACC = Range("C12").value это сохранит значение в этой ячейке как строку, и аналогично, когда вы используете смещения: .Offset(ColumnCount, 1).value = devicesStockedACC это должно помочь некоторым:)

Другие вопросы по тегам