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

Я нахожусь в процессе разработки макроса, который будет передавать данные из одной рабочей книги (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

person user3407689    schedule 11.03.2014    source источник
comment
Я не получаю никаких ошибок, когда запускаю этот код. Где вы получаете ошибку? Ни одна из переменных в блоке with в конце нигде не включена в размещенный код. Также вы не можете использовать .select для выбора более одной строки за раз... поэтому каждый раз, когда вы выбираете новую ячейку, предыдущая отменяется. используйте отладчик, чтобы пройтись по коду и посмотреть, что происходит   -  person user1759942    schedule 12.03.2014
comment
Хорошо, я ценю помощь. Я заставил его работать сейчас. В любом случае, он должен начинаться с currentRow (3) и переходить к первой пустой ячейке? В настоящее время он будет зацикливаться до тех пор, пока под ним не появится заполненная ячейка. Знаете ли вы, как я могу заставить его работать с первой пустой ячейкой, независимо от того, есть ли под ней пустая ячейка или заполненная ячейка. Я ценю вашу помощь.   -  person user3407689    schedule 13.03.2014


Ответы (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 будет истинным, если текущая ячейка пуста. чтобы перебрать каждую ячейку (столбец) в каждой строке, вам понадобится еще один цикл 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, это должно помочь некоторым :)

person user1759942    schedule 13.03.2014
comment
Итак, я запустил рабочий лист в диапазоне A2, который не был пуст, а затем запустил приложение, которое вы предоставили. Кажется, я не двигался, когда выполнял весь код. И теперь у меня проблемы с установкой значений в ячейках с помощью команды смещения, которую я использую. Я новичок в VBA и прошу прощения за беспокойство, я действительно ценю вашу помощь. - person user3407689; 13.03.2014
comment
Я добавил, что мой код сейчас с вашей помощью в диалоговом окне выше. - person user3407689; 13.03.2014
comment
ха-ха, я не установил colCount в своем коде, чтобы он был равен 0. Я отредактировал свой ответ - person user1759942; 13.03.2014