Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 数据扩展时自动复制公式_Excel_Vba_Worksheet Function - Fatal编程技术网

Excel 数据扩展时自动复制公式

Excel 数据扩展时自动复制公式,excel,vba,worksheet-function,Excel,Vba,Worksheet Function,大家好,我有大量数据,每周更新两次。数据集不断缩小和增长。 我的问题是,尽管手动删除或扩展使数据可用的公式对我来说很容易,但我希望自动化这个过程。 公式包括10列 好的-需要帮助,我只是好像不能让我的头转过来-请帮助 工作表名为“数据” 我正在使用标题为“任务编号”的列A来扩展公式 这些公式的单位是Y到AJ 我只想让公式扩展到行中的最后一个条目-听起来很简单 目前数据覆盖30000行 还有一件事,数据是使用复制粘贴宏导入到电子表格中的,这是造成我的问题的部分原因吗 在13时30分插入 这是我试过

大家好,我有大量数据,每周更新两次。数据集不断缩小和增长。 我的问题是,尽管手动删除或扩展使数据可用的公式对我来说很容易,但我希望自动化这个过程。 公式包括10列

好的-需要帮助,我只是好像不能让我的头转过来-请帮助

工作表名为“数据”

我正在使用标题为“任务编号”的列A来扩展公式

这些公式的单位是Y到AJ

我只想让公式扩展到行中的最后一个条目-听起来很简单

目前数据覆盖30000行

还有一件事,数据是使用复制粘贴宏导入到电子表格中的,这是造成我的问题的部分原因吗

在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

请(再次)提供帮助。

我可以想出两种方法,一种是直接使用Excel,另一种是使用VBA

测试场景:

假设A列和B列包含变量数据,C列和D列包含公式(一旦您在后台登录,包含公式的列的数量将不重要)

此外,我们在C列中的公式为=A+B,在D列中的公式为=A-B(C1=A1+B1,D1=A1-B1等)

Excel:

  • 在公式中添加一个测试,以检查a列中是否有任何值。如果没有值,我们将不在单元格中添加任何信息。示例:C1=IF(LEN(A1)>0,A1+B1,”)/D1==IF(LEN(A1)>0,A1-B1,”)。使用此公式,您可以将公式复制到整个列中,如果不存在数据,则不会显示任何内容。
    • 优点:易于实施
    • 缺点:根据您的公式,计算时间可能会很长
VBA:

  • 您可以使用工作表_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
Private子工作表\u更改(ByVal目标作为范围)
暗淡的lCellCount与长
暗淡的颜色和长的颜色一样
将工作表调整为Excel.工作表
淡橙色资源为Excel.Range
暗橙色显示为Excel.Range
'定义工作表
设置工作表=工作表(“数据”)
'计算数据集中现在有多少个条目
lCellCount=oWorkSheet.Range(“A1”).End(xlDown).Row
'计算需要适当删除的公式数
lFormulaCount=WorksheetFunction.CountA(oWorkSheet.Columns(“Y”))
如果lCellCount lFormulaCount,则
“我想我们的报告中至少会有一行。。。
如果lFormulaCount>2,则为oWorkSheet.Range(“Y3:AJ”&lFormulaCount.ClearContents
设置oRangeSource=oWorkSheet.Range(“Y2:AJ2”)
设置OrangeTest=oWorkSheet.Range(“Y2:AJ”和lCellCount)
OrangeTest.Formula=oRangeSource.Formula
如果结束
端接头

Rgds

我认为这段代码将对您有所帮助。它假定您为数据列和公式列前面的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

谢谢-现在就开始尝试,我有一点VBA知识,所以我将尝试工作表的更改。这是我已经尝试过的工作表(“数据”)。选择Bot=Range(“A3”)。结束(xlDown)。行范围(“Y30000”,“AJ30000”)。选择范围(“Y30000”,“AJ30000”)。复制选择。自动填充目标:=Range(“Y30001”&Bot&,“:AJ30001”&Bot),类型:=xlFillDefaultHi@SteveW1968,我在回答中添加了一个代码。。。您能检查一下吗?它工作正常-谢谢,它突出显示了一个引导问题,因此延迟返回。我发现我在A300052的原始数据中有一个流氓手机!非常感谢。因此,通过运行上面的VB,我认为我的数据已经结束,因此强调了我们的朋友Jean François Corbett教授的流氓细胞,我们应该尽可能避免使用复制粘贴。