使用VBA

时间:2017-11-11 11:19:04

标签: vba excel-vba excel

我有一个与VBA相关的问题,该问题与基于插入到另一张表中的数据扩展公式有关,但有一些含义。更具体地说,我想要表格中的公式"计算"从单元格A3:AB3扩展,基于工作表中列A中填充的行数"响应"。然后从下面的这一点删除单元格的内容(这是为了动态调整工作表中的填充公式"计算"如果在工作表中填充的行数较少"响应"与上次相比) 。棘手的部分是那张表"回应"可能是空的(所以我们不想要无限循环);通过复制粘贴填充数据,或者用户可以完全删除它并插入从数据库下载的具有相同名称的新选项卡(我使用INDIRECT避免了我的公式中的错误)。

最后因为表"计算"总是被隐藏起来,正如所提到的那样#34;回应"可能会被删除并重新插入,并不认为代码可以通过定位工作表中的更改来运行"响应"。可行的方法是将一个按钮插入名为"输出"或者每次此工作表("输出")处于活动状态时运行代码(因此可能会将代码保存在那里)。

我所拥有的是非常简单的,根本不能做我需要的事情。我无法从同一张纸中的AD列中的另一张纸上读取它。

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("AD:AD")) Is Nothing Then
    Application.EnableEvents = False

    lastrow = Range("AD3000").End(xlUp).Row
    Range("A3:AB3").AutoFill Destination:=Range("A3:AB" & lastrow), Type:=xlFillDefault
    Application.EnableEvents = True
End If

End Sub

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您的工作表将被删除,您可以在Workbook_SheetChange模块中使用ThisWorkbook事件,并检查sh.Name = "Responses"是否应用代码的逻辑。

代码(在ThisWorkbook模块内)

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

Dim LastRow As Long
Dim CalcSht As Worksheet

' set Worksheet object
Set CalcSht = ThisWorkbook.Sheets("Calculations")

With Sh
    If .Name = "Responses" Then ' check if changes were made in a worksheet named "Responses"
        Application.EnableEvents = False

        ' --- First: clear formulas form all cells (below row 3) ---
        LastRow = CalcSht.Cells(CalcSht.Rows.Count, "A").End(xlUp).Row  ' get the last row in column A
        If LastRow < 4 Then LastRow = 4
        CalcSht.Range("A4:AB" & LastRow).ClearContents ' clear contents (formulas) from row 4 and below


        ' --- Second: populate formulas on all rows after row 3 (where there is data in column A) ---
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row  ' get the last row in column A

        If Not Intersect(Target, .Range("A1:A" & LastRow)) Is Nothing Then
            Application.EnableEvents = False

            ' drag formulas until last row with data in column A (in "Responses" worksheet)
            CalcSht.Range("A3:AB3").AutoFill Destination:=CalcSht.Range("A3:AB" & LastRow), Type:=xlFillDefault
        End If
    End If
End With
Application.EnableEvents = True

End Sub