Автоматически копировать формулы при расширении данных - PullRequest
2 голосов
/ 31 марта 2011

Привет всем, у меня большой набор данных, который обновляется два раза в неделю. Набор данных уменьшается и непрерывно растет. Моя проблема в том, что, хотя мне достаточно легко вручную удалить или развернуть формулы, которые делают данные пригодными для использования, я хотел бы автоматизировать этот процесс. Формулы охватывают 10 столбцов.

ОК - Нужна помощь, я просто не могу разобраться с рабочим листом - обмен, пожалуйста, помогите.

Рабочий лист называется «данные».

Я использую Col A под названием «task no», чтобы основывать расширение формул.

Формулы приведены в столбцах Y - AJ.

Все, что я хочу, - это формулы, чтобы расширить себя до последней записи в строке - звучит легко ??????

По данным в настоящее время охватывают 30 000 строк,

Еще одна вещь, данные импортируются в электронную таблицу с помощью макроса копирования и вставки, это частично вызывает мою проблему?

Вставить в 13.30

Вот что я пробовал

Sheets("data").Select 

Bot = Range("A3").End(xlDown).Row 

Range("Y30000", "AJ30000").Select 

Range("Y30000", "AJ30000").Copy 

Selection.AutoFill Destination:=Range("Y30001" & Bot &, ":AJ30001" & Bot), 

Type:=xlFillDefault

Пожалуйста, помогите (снова)

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Я могу придумать два способа сделать это: один напрямую в Excel, а другой - с помощью VBA.

Сценарий тестирования:

Давайте представим, что у нас есть столбцы A и B с переменными данными, а затем столбцы C и D с формулами (как только вы получите логин за кулисами,количество столбцов с формулами не будет иметь значения).

Кроме того, наши формулы в столбце C: = A + B и в столбце D = AB (C1 = A1 + B1, D1 = A1-B1 ии т. д.).

Excel:

  • Добавьте в формулы тест, чтобы проверить, есть ли какое-либо значение в столбце A. Если значения нет, мыне буду помещать какую-либо информацию в камеру.Пример: C1 = IF (LEN (A1)> 0, A1 + B1, "") / D1 = = IF (LEN (A1)> 0, A1-B1, "").Используя эту формулу, вы можете скопировать формулу во все столбцы, чтобы ничего не отображалось, если нет данных.
    • Плюсы: Простота реализации
    • Минусы: Время расчета может занять очень много времени в зависимости от ваших формул

VBA:

  • Вы можете реализовать подпрограмму для обновления формул после изменения данных на листе с помощью Worksheet_Change ().
    • Плюсы: Требуется минимальное знание VBA (почти нет, если люди в SO создают для вас код)
    • Минусы: ЕслиВы не знаете, VBA, вы можете зависеть от кого-то еще для реализации.

Надеюсь, это поможет вам решить вашу проблему!

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

Формула VBA для этого будет выглядеть следующим образом ...

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim lCellCount As Long
    Dim lFormulaCount As Long
    Dim oWorkSheet As Excel.Worksheet
    Dim oRangeSource As Excel.Range
    Dim oRangeDest As Excel.Range

    'Define sheet
    Set oWorkSheet = Worksheets("Data")

    'Count how many entries we have in our dataset now
    lCellCount = oWorkSheet.Range("A1").End(xlDown).Row

    'Count how many formulas we have to proper delete
    lFormulaCount = WorksheetFunction.CountA(oWorkSheet.Columns("Y"))

    If lCellCount <> lFormulaCount Then

        'I assume we'll have at least one line in our report...
        If lFormulaCount > 2 Then oWorkSheet.Range("Y3:AJ" & lFormulaCount).ClearContents

        Set oRangeSource = oWorkSheet.Range("Y2:AJ2")
        Set oRangeDest = oWorkSheet.Range("Y2:AJ" & lCellCount)

        oRangeDest.Formula = oRangeSource.Formula

    End If

End Sub

Rgds

0 голосов
/ 31 марта 2011

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

' DA1 = 1st data row, FR1 = first formula row
Dim rgDA1 As Range: Set rgDA1 = Range("HDR_ROW_FOR_DATA").Offset(1)
Dim rgFR1 As Range: Set rgFR1 = Range("HDR_ROW_FOR_FORMULAS").Offset(1)
Dim ws As Worksheet: Set ws = rgDA1.Worksheet

' define range rgDAT to cover ALL data rows, and define rgFRM w the same# rows
Dim rgDAT As Range: Set rgDAT = rgDA1.Resize(1 + ws.Rows.Count - rgDA1.Row)
                    Set rgDAT = Intersect(rgDAT, ws.UsedRange)
Dim rgFRM As Range: Set rgFRM = rgFR1.Resize(rgDAT.Rows.Count)

' now copy the 1st formula row to the other rows
rgFR1.Select
Selection.Copy
rgFRM.Select
ws.Paste
Application.CutCopyMode = False
...