每次复制模板并使用Excelmacros进行replace

我在我的工作sheet 1有以下数据集

在这里输入图像描述

而这个模板在sheet 3

在这里输入图像描述

我希望

  1. sheet 3的模板复制到sheet 3
  2. 从表1中的第1行读取城市和名称
  3. 在表2中replaceCityName
  4. sheet 1每一行重复一遍

所以我的理想输出是:

在这里输入图像说明

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

我试过这个代码,但是它没有去循环'sheet1'

 Private Sub CommandButton1_Click() Application.ScreenUpdating = False Dim copySheet As Worksheet Dim pasteSheet As Worksheet Dim ii As Long Set copySheet = Worksheets("Sheet3") Set pasteSheet = Worksheets("Sheet2") For ii = 1 To 10 copySheet.Range("A1:E3").Copy pasteSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues Application.CutCopyMode = False Application.ScreenUpdating = True Dim j, k, L, b As String Dim i As Long Dim wb As Workbook Dim sht1 As Worksheet Dim sht2 As Worksheet Set wb = ThisWorkbook Set sht1 = wb.Sheets("Sheet1") Set sht2 = wb.Sheets("Sheet2") j = "Name" b = "City" For i = 1 To 3 k = sht1.Range("A" & i) L = sht1.Range("B" & i) sht2.Cells.Replace what:=j, replacement:=k, lookat:=xlWhole, MatchCase:=False sht2.Cells.Replace what:=b, replacement:=L, lookat:=xlWhole, MatchCase:=False Next i Next ii End Sub 

任何指导真的很感激。

这不是你所要求的,但是你完全可以用单元格公式完成这个任务。 这有点复杂,VBA可能是一个更好的方法,但万一你好奇:

我假设你的名字/城市对在Sheet1!$A$1:$B$9 **

在这里输入图像说明

在表2的A列中,我将构build一个列表,指出从哪个行抓取数据。 (1,1,1,2,2,2,3,3,3,4,4,4等)

在表2的B栏中,我将build立一个列表,显示该目的地行应该具有哪种types的结果(名称 – 城市名称是1 ,名称城市 – 城市是2 ,名称 – 城市是3 )。这样做。 填充列A =INT((ROW()-1)/3)+1和列B =MOD(ROW()-1,3)+1

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

在这里输入图像说明

现在我可以使用这些来针对原始数据build立索引查找。 C列将有两种不同types的行为。 它始终以名称开头,但如果B列为2,则紧接着是城市。

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

D列也有两种types的条目。 总是从城市开始,但是如果B列是1 ,跟着名字。

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

在这里输入图像说明

如果你想,你可以用列表中的实际公式replace列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列进行相应的replace,可以省略A列和B列。

在这里输入图像描述

这种方法的一个小麻烦是,因为它依赖于row() ,所以不能在不调整两个索引公式的情况下移动到任何其他行( INT((ROW()-1)/3)+1MOD(ROW()-1,3)+1


**在现实世界中,我也会给你的源数据表一个名字,像NameCityTable那么你的第一个结果列可能看起来像:

 =INDEX(NameCityTable,INT((ROW()-1)/3)+1,1)&" "&IF(MOD(ROW()-1,3)+1=2,INDEX(NameCityTable,INT((ROW()-1)/3)+1,2),"") 

尝试这个:

 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 

input:

工作表Sheet1:

在这里输入图像说明

表Sheet 3:

在这里输入图像说明

输出:

Sheet2中:

在这里输入图像说明