VBA Excel单词搜索和复制公式

时间:2015-08-02 10:26:56

标签: excel vba excel-vba search excel-formula

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

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

Excel example

我不太确定它是否容易,但我完全过度挑战。我非常感谢你的帮助。

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区域修正难以描述我已经添加了更好的图片公式。我现在明白这是可以理解的enter image description here

2 个答案:

答案 0 :(得分: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时给出余数,当它等于零时,你知道你有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"的值上添加一些逻辑。当它发生变化时。

答案 1 :(得分:0)

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

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

Excel有一个名为"数据透视表"这实际上允许您将列表中的数据进行夏季化。

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

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

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

@Nathalie。如果不了解更多信息,很难提供帮助。例如,是否已插入带有平均文本的数据。看起来A列的数字代表组内的行号(公式可以使用它来创建数据透视表所需的" Group Name"列。

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

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

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

    2. 一个。给出"组名" B.计算它所在的组,所以每隔6个你就可以进行所需的调整。

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