vba excel查找字符串,移动到偏移位置,将动态范围复制到另一个工作表

时间:2016-05-16 16:50:26

标签: excel vba dynamic range offset

我之前一直在做的是手动选择,然后将报表中的原始数据复制/粘贴到标题为" ImportDump"的工作表中。从这里开始,我使用VBA选择并将我感兴趣的11个范围复制到Sheet1和Sheet2中的特定位置。我将明确说明数据在ImportDump工作表中占用的范围并将其复制。这样做有效但不再简单。

相反,我计划使用Find方法在ImportDump表中的A列中搜索每个表标题,然后使用Find的结果加上偏移量作为起始位置动态范围。例如,字符串" Capital Premier"在A30中找到,但我需要的范围从B33开始。然后,我需要所有行向下到列B中的下一个空白单元格,并且所有列都到达下一个空白列(数据总是在列J中完成)。然后重复所有11个标题字符串。标题将全部出现在列A中,所有表将与搜索字符串结果(3,1)具有相同的偏移量,并且具有相同数量的列(9),但不一定具有相同的行数。

我想我知道如何进行搜索IDump.Range("A1:A200").Find(What:="Capital Premier", LookIn:=xlValues, LookAt:=xlPart),而且我非常确定我可以使用.End(xldown)选择下一个空行,但我不是确定如何将所有这些与偏移结合起来表达我的动态范围的起始位置。有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

编辑:我找到了理想的解决方案(除非有人提出更好的解决方案)

此代码结合了一张表格("说明")的用户定义字符串,在单独的表格中搜索字符串(" ImportDump" - 一个原始数据转储),一旦找到该字符串,它就会跳转到一个偏移的单元格位置(3,1),找到下一个空格之前的最后一行和最后一列,选择偏移位置,lastrow和lastcol所列出的范围,副本在初始搜索表中定义的与搜索字符串对应的位置(工作表,然后是单元格)的范围。然后循环遍历所有其余的用户定义字符串,直到"指令"中的表的最后一行。找到范围并将它们粘贴到相应的预定位置。感谢大家的投入!

Sub ImportLeagueTables()

Dim r As Range
Dim i As Integer
Dim IDump As Worksheet
Dim Instruct As Worksheet
Dim what1, where1, where2 As String
Dim TeamRng, TableRng, f, g As Range
Dim LastRowTeam As Long, Lastrow, Lastcol As Long

Set Instruct = Sheets("Instructions")
Set IDump = Sheets("ImportDump")
    LastRowTeam = Instruct.Range("M4").End(xlDown).Row

Set TeamRng = Instruct.Range("M4:O" & LastRowTeam)

i = 1

     For Each r In TeamRng.Rows 'rows to loop through

         what1 = TeamRng.Range("A" & i) 'the string to find
         where1 = TeamRng.Range("B" & i)
         where2 = TeamRng.Range("C" & i)

            Set f = IDump.Columns(1).Find(what1, LookIn:=xlValues, LookAt:=xlPart)
            Set g = f.Offset(3, 1)
            Lastrow = g.Range("A1").End(xlDown).Row
            Lastcol = g.SpecialCells(xlCellTypeLastCell).Column

            Set TableRng = IDump.Range(g, IDump.Cells(Lastrow, Lastcol))

                TableRng.Copy
                Sheets(where1).Range(where2).PasteSpecial xlValues

            i = i + 1

         Next r

End Sub

原创的,不太健全的解决方案:好的,我通过明确定义参考第一个单元格的范围即Set g = f.Offset(3, 1)和{{1}来提出可行的解决方案虽然那并不像我想的那么优雅。更愿意使用g来向下和向下选择所有单元格,直到下一个空白行/列。

完整代码:

Set CapPremRng = g.Range("A1:I10")