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