每次复制模板并使用Excel宏替换

时间:2017-03-29 21:37:02

标签: excel vba excel-vba

我的$hereStr=@' Platform,"Cap Used %" P1,0% P2,18% P3,6% '@ $TempData = $hereStr | ConvertFrom-Csv (($TempData."Cap Used %").Replace('%','') | Measure-Object -Average).Average

中有以下数据集

enter image description here

此模板位于sheet 1

enter image description here

我希望

  1. 将模板从sheet 3复制到sheet 3
  2. sheet2
  3. 的第1行读取城市和名称
  4. 替换表2中的sheet1City
  5. Name
  6. 中的每一行重复此操作

    所以我理想的输出是:

    enter image description here

    正如您所看到的,因为我们在工作表1中有三行,所以模板被复制三次。

    我尝试了这段代码,但它并没有循环播放“Sheet1'

    sheet 1

    任何指导都非常感谢。

2 个答案:

答案 0 :(得分:2)

这不是你要求的,但你完全可以用细胞公式来完成。这有点复杂,VBA可能是一个更好的方法,但万一你好奇:

我假设您的姓名/城市对位于Sheet1!$A$1:$B$9 **

enter image description here

在表2中,在A列中,我将构建一个列表,指示从中获取数据的行。 (1,1,1,2,2,2,3,3,3,4,4,4等)

在表2的B栏上,我将构建一个列表,显示此目标行应具有的结果类型(名称 - 城市名称为1,名称城市 - 城市为2,以及名称 - 城市为3)有多种方法可以做到这一点。我在列A中填充=INT((ROW()-1)/3)+1,列B填充=MOD(ROW()-1,3)+1

现在我在Sheet 2上的前两列看起来像

enter image description here

现在我可以使用它们来构建针对原始数据的索引查找。 C列将有2种不同类型的行为。它始终以Name开头,但如果B列为2,则后面是City。

=INDEX(Sheet1!$A$1:$B$9,S A1,1)&IF(B1=2," " & INDEX(Sheet1!$A$1:$B$9, A1,2),"")

D列也有两种类型的条目。始终从City开始,但如果B列是1,请按照名称进行操作。

=INDEX(Sheet1!$A$1:$B$9,A1,2)&IF(B1=1," " & INDEX(Sheet1!$A$1:$B$9,A1,1),"")

enter image description here

如果您愿意,可以替换所有对A列和A列的引用。 B与其中的实际公式。

然后C列将有:

=INDEX(Sheet1!$A$1:$B$9,INT((ROW()-1)/3)+1,1)&" "&IF(MOD(ROW()-1,3)+1=2,INDEX(Sheet1!$A$1:$B$9,INT((ROW()-1)/3)+1,2),"")

在D列中进行相应的替换,您可以省略A列和B列。

enter image description here

这种方法的一个小小的不便是,因为它依赖于row(),所以无法调整两个索引公式(INT((ROW()-1)/3)+1& {{1},它无法移动到任何其他行}})

** 在现实世界中,我还会为您的源数据表提供一个名称,例如MOD(ROW()-1,3)+1然后您的第一个结果列可能如下所示:

NameCityTable

答案 1 :(得分:1)

试试这个:

Private Sub CommandButton1_Click()
Dim rng1() As Variant, rng2 As Range, rng3() As Variant,k&
With Worksheets("Sheet1")
    rng1 = .Range(.Cells(1, 1), .Cells(.Rows.Count, 2).End(xlUp)).Value
End With
With Worksheets("Sheet3")
    rng3 = .Range(.Cells(1, 1), .Cells(.Rows.Count, 2).End(xlUp)).Value
End With
With Worksheets("Sheet2")
    For k = LBound(rng1, 1) To UBound(rng1, 1)
        Set rng2 = .Range("A1").Offset(UBound(rng3, 1) * (k - 1)).Resize(UBound(rng3, 1), UBound(rng3, 2))
        With rng2
            .Value = rng3
            .Replace "City", rng1(k, 2)
            .Replace "Name", rng1(k, 1)
        End With
    Next k
End With
End Sub

输入:

Sheet 1中:

enter image description here

表Sheet 3:

enter image description here

输出:

Sheet 2中:

enter image description here