【问题标题】:VBA Excel word search and copying formulasVBA Excel 单词搜索和复制公式
【发布时间】:2015-08-02 10:26:55
【问题描述】:

我正在为 Excel 搜索 VBA 宏,它可以检测 A 列中的单词“mean”。在此之后,它会将带有 C 中公式的黄色行复制到 J。 该公式计算从最后一个“平均值”之后的一行到下一个的平均值 =AVERAGE (C1323:C1437)

每六个均值之后还需要有Area和150,在均值之后复制两行,I和J需要更改。因此,在这种情况下,I 和 J 将引用单元格 A1441 (=G1439/C1439*$A$1441) 直到文件末尾。

我不太确定这是否容易,但我完全接受了挑战。非常感谢您的帮助。

Sub Makro1()
'
' Makro1 Makro
'
' Tastenkombination: Strg+q

   strSearchWord = "Mean"
i = Application.WorksheetFunction.CountIf(Range("A:A"), strSearchWord)
Y = 2
For x = i To 0
i = Application.WorksheetFunction.Match(strSuchWort, Range("A:A"), 0)
     Range("C" & i).Select

Application.CutCopyMode = False
      ActiveCell.FormulaR1C1 = "=AVERAGE(R[-147]C:R[-1]C)"  ' that's still wrong, should be something like i-y?
    Selection.AutoFill Destination:=Range("C" & i:"J" & i), Type:=xlFillDefault
    Range("CY:JY").Select
i = Y

'for each fifth i
 'Range("A" & i + 3).Select
  '  ActiveCell.FormulaR1C1 = "=RC[-2]/RC[-6]*R2159C1"

Next x

End Sub

还是错了,不过是我的初稿。

@stucharo 面积校正很难描述我用公式添加了更好的图片。我希望现在可以理解了

【问题讨论】:

    标签: vba excel search excel-formula


    【解决方案1】:

    如果您的行 ActiveCell.FormulaR1C1 = "=AVERAGE(R[-147]C:R[-1]C)" 每次都需要更改表示之间的行数,那么您需要按照评论建议添加一个变量。此外,只需将字符串写入单元格值 (ActiveCell.Value) 意味着当您单击工作簿中的单元格时,您将看到它以公式形式写入(它会突出显示范围等)。您可以尝试将其替换为:

    ActiveCell.Value = "=AVERAGE(R[" & i - Y & "]C:R[-1]C)"
    

    虽然我看不到您工作表的第一行,但我不确定每次都能为您提供正确的行范围。

    如果您的行号可能会更改,并且您每次都复制相同数量的列,那么将公式直接写入循环中的单元格也可能同样容易,而不是显式复制它。

    在每 6 个“平均值”之后添加文本将需要您计算到目前为止已通过的平均值。这可以通过递增计数器变量来完成,并使用Mod 运算符将告诉您除法后的余数。因此,numberOfMeans Mod 6 将在除以 6 时为您提供余数,当这等于 0 时,您知道您有 6 的倍数。

    我已尝试将所有这些捕获到下面的代码中.....

    Sub Test()
    
    Application.ScreenUpdating = False
    
    Dim startRow As Integer
    startRow = 2
    Dim endrow As Integer
    endrow = Range("A2").End(xlDown).row
    
    Dim lastMeanRow As Integer
    lastMeanRow = startRow - 1
    Dim areaRow as Integer
    areaRow = lastMeanRow + 3
    Dim meanCounter As Integer
    meanCounter = 0
    
    Dim avgColHeight As Integer
    Dim col As Integer
    Dim row As Integer
    
    'Check each row in the sheet
    For row = startRow To endrow
        'Cols i and j in every row need to be modified
        For col = 9 To 10
            Cells(row, col).Value = "=RC[-2]/RC[-6]*R" & areaRow & "C1"
        Next col
    
        'If column 1 of that row contains "mean" then
        If Cells(row, 1).Value = "mean" Then
    
            'Calculate the column height to average over....
            avgColHeight = row - lastMeanRow - 1
            '...and loop through each of the columns....
            '(including i and j to add average)
            For col = 3 To 10
                '....inserting the averaging formula.
                Cells(row, col).Value = "=AVERAGE(R[-" & avgColHeight & "]C:R[-1]C)"
            Next col
    
            'Then increment the counter to keep track of the number of means
            meanCounter = meanCounter + 1
            'If the number of means is a multiple of 6 then
            If (meanCounter Mod 6 = 0) Then
                'insert the "Area" and "150" strings
                Cells(row + 2, 1).Value = "Area"
                Cells(row + 3, 1).Value = "150"
                areaRow = row + 3
            End If
    
            'Finally change the lastMeanRow to the mean row we have just processed.
            lastMeanRow = row
    
        End If
    'Do it again until we reach the end of the data
    Next row
    
    Application.ScreenUpdating = True
    
    End Sub
    

    我还注意到你关于 area 值周期性变化的观点。如上所述,以编程方式编写此代码将允许您在“区域”的值及其更改时添加一些逻辑。

    【讨论】:

    • 非常感谢,它对手段非常有用。复制区域和 150 作品也在正确的点。一个问题没有完全解决,我不明白它在哪里实施以及错误是如何演变的。第 I 行和第 J 行之间的平均值,在原始数据中应该是 =G6899/C6899*$A$"复制 150 的单元格的值",谢谢
    • @Nathalie 我不太明白,我和 J 在每一行中应该相同还是 I = G / C 和 J = H / D?使用的 150 单元格应该高于还是低于当前行?
    • 我添加了一张图片来描述问题。在插入区域之后,区域的使用单元格需要在下方。而 mean 应该计算上面的单元格(在脚本中正确)
    • @Nathalie 我想我现在明白了,我已经稍微修改了代码,它会运行得慢一些,因为您现在需要更新每一行(更改列 I 和 J 中的区域单元格)。在开始之前,您还需要为第一个区域设置一个值。
    • 几乎 :-) I 和 J 仅在插入区域后更改,现在它们在每个平均值后更改。所以我想在 If (meanCounter Mod 6 = 0) Then 之后应该有一个计数器,用于像 lastmeanrow 这样的变量。试过了。但无法实现。没关系,它的速度较慢,到目前为止它很棒,谢谢
    【解决方案2】:

    您显然拥有一长串数据,并希望自动创建您描述的行和公式。

    可以编写 VBA 来扫描数据并修改公式等,但首先我会质疑这是否是满足您所需的最佳方法。

    Excel 有一个称为“数据透视表”的功能,它实质上允许您汇总列表中的数据。

    例如,如果列表为世界上每个城市都有一行,并给出了该城市的人口,一列给出了它所在的国家/地区。数据透视表可用于创建一个国家/地区的平均人口国家城市。我怀疑你正在做这种事情。

    如果您不了解数据透视表,您应该了解它们。见here

    在您的情况下,您的平均行是对其上方行中的数据进行汇总。要使用数据透视表,您必须有一个列来定义每行所在的组。数据透视表会将此列作为行摘要,然后您将为所有其他列创建平均值。

    @娜塔莉。如果不了解更多信息,很难提供帮助。例如,交付的数据是否已插入平均文本。看起来 A 列有一个数字,代表组内的行号(公式可以使用它来创建数据透视表所需的“组名称”列。

    您可以通过以下方式获取数据透视表以进行区域调整:

    1. 创建一组新的列,其中包含导致复制列 C 到 J 中的值的公式,除非它是第 6 组数据,在这种情况下您相应地调整 C 到 J 中的值)。

      1. 您可能需要引入以下列:

      2. A.给出“组名” B. 数一下它在哪个组中,这样每 6 次您就可以进行所需的调整。

    4 通过使用数据透视表和基本技术,您会发现如果需要,更新和刷新数据很容易。

    【讨论】:

    • 谢谢,好主意。但是Area的值是周期性变化的,需要可变,所以在这种情况下是行不通的。
    • @Nathalie,您是否使用数据透视表来创建方法?还是您的意思是将您的评论放在另一个答案下?我的直觉是,您可能可以使用数据透视表做您需要的事情,但由于您对问题的解释有限,我无法提供更多帮助。我相信会有一些方法可以改变面积的价值。
    • 没有评论是针对你的。这很有帮助。我尝试过这个。问题的一部分是可以解决的。但它没有完全工作。区域会定期更改,在某些情况下,在检查值之后甚至有时会手动更改。因此,I 和 J 中的公式需要适应...
    猜你喜欢
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2021-03-29
    • 2023-04-08
    • 2016-10-26
    相关资源
    最近更新 更多