#excel #vba #vba6
#превосходить #vba #vba6
Вопрос:
У меня есть лист Excel, который собирает данные с сервера на основе диапазона дат в 2 недели.
Имя тега Сервера | |
---|---|
1/1/2020 0:00 | |
1/14/2020 11:59 | 12/31/2020 11:59 |
Дата | Ценность |
…. | …. |
Моя цель-скопировать ячейки из столбцов даты и значения (более 10 строк) в другой лист Excel с именем «TankDataAll». Ячейки иногда будут содержать пробелы (только формулы), мне понадобятся только значения в ячейке.
Затем мне нужно будет увеличить диапазон дат еще на 2 недели, например, с 1/15/2020 0:00 до 1/28/2020 11:59, скопировать/вставить новые значения и добавить на лист «NewExcel». Приращение цикла for остановится в заданную дату в 12/31/2020 11:59, как показано в ячейке B3.
Я выяснил, как копировать и вставлять значения на другой лист Excel, показанный ниже:
Sub Generate() Dim wsCopy As Worksheet Dim wsDest As Worksheet Dim lCopyLastRow As Long Dim lDestLastRow As Long 'Set variables for copy and destination sheets Set wsCopy = Workbooks("TankData.xlsm").Worksheets("Sheet1") Set wsDest = Workbooks("TankDataAll.xlsx").Worksheets("Sheet1") 'Find last used row in the copy range based on data in column A lCopyLastRow = wsCopy.Cells(wsCopy.Rows.Count, "A").End(xlUp).Row 'Find first blank row in new sheet based on data in column A lDestLastRow = wsDest.Cells(wsDest.Rows.Count, "A").End(xlUp).Offset(1).Row 'Copy and Paste Data wsCopy.Range("A4:B" amp; lCopyLastRow).Copy wsDest.Range("A" amp; lDestLastRow).PasteSpecial Paste:=xlPasteValues End Sub
Я также выяснил, как копировать только значения ячеек и игнорировать формулы:
Sub NoFormula() Dim lr As Long ' Find last row in column B with data to copy from on sheet 2 lr = Sheets("Sheet1").Columns("A").Find("*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows, LookIn:=xlValues).Row ' Copy value to sheet 2 Sheets("Sheet1").Range("A4:B" amp; lr).Copy Sheets("Sheet2").Range("A1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub
Я не могу понять, как объединить эти два параметра, чтобы я мог копировать и вставлять значения, игнорируя формулы. В настоящее время первый приведенный выше фрагмент кода позволяет мне копировать и вставлять на другой лист Excel. Однако, как только я снова скопирую ячейки на новый лист, на новом листе появятся пробелы из-за «пустых» ячеек формулы на исходном листе. Любая помощь будет оценена по достоинству. Спасибо!
Ответ №1:
Насколько я могу судить, код, который вы связали в первом сегменте, должен успешно скопировать и вставить значения — это выглядит допустимым
wsCopy.Range("A4:B" amp; lCopyLastRow).Copy wsDest.Range("A" amp; lDestLastRow).PasteSpecial Paste:=xlPasteValues
Я не знаю, почему у вас возникнут проблемы с этим, но одним из обходных путей было бы прямое присвоение значений
wsDest.Range("A1").Value = wsCopy.Range("A1").Value
или для этого примера, что-то вроде:
wsDest.range("A" amp; lDestLastRow amp; ":B" amp; lDestLastRow lCopyLastRow - 4).Value = wsCopy.Range("A4:B" amp; lCopyLastRow).Value
Комментарии:
1. Спасибо за ваш ответ, Неон. Обе функции прекрасно работают по отдельности. Я застрял на поиске способа объединить две функции, скопировав значения (и проигнорировав формулы) из «TankData» и вставив значения в «TankDataAll».