相同条件VBA之间的复制范围

时间:2018-10-04 04:09:16

标签: excel vba excel-vba

我需要在同一字符串之间复制一个范围,比方说,我需要在两次复制之间复制所有内容:

Copy abcd abcd abcd abcd abcd abcd copy

结果:

abcd abcd abcd abcd abcd abcd

我到处搜索,找不到答案。

我设法找到了我想要的字符串的最后一次出现,但是我无法弄清楚如何在相同的两个字符串之间复制行范围,这就是我到目前为止所得到的

Public Sub buscaIntervalo()
    Dim sPalavra As String
    Dim rngTermo As Range
    sPalavra = "Grupo: 1 - Ativos" 'criteria string

    Set rngTermo = Range("C1:C999").Find(what:=sPalavra, After:=Range("C1"), searchorder:=xlByColumns, searchdirection:=xlPrevious)
MsgBox (rngTermo.Address) 'returns it´s last occurrence
End Sub

3 个答案:

答案 0 :(得分:0)

  

我到处搜索,找不到答案。

dim str as string, d as string
str = "abc copy ABCD EFGH IJKL MNOP QRST UVWX YZ copy def"
d = "copy"

使用嵌套的InStr函数定位起点和终点。

str = mid$(str, instr(1, str, d, vbtextcompare)+len(d)))
str = trim$(left$(str , instr(1, str, d, vbtextcompare) - 1))
debug.print str

使用 copy 作为分隔符。

str = trim$(split(split(str, d)(1), d)(0))
'*copy* is used for both start and stop; the above could be
str = trim$(split(str, d)(1))
debug.print str

使用正则表达式检索子字符串。

dim rgx as object
set rgx = createobject("vbscript.regexp")
with rgx
    .global = False
    .ignorecase = True
    .multiline = False
    .pattern = d & " (.*?)(?= " & d & ")"
    if .test(str) then
        str = mid$(.execute(str)(0), 6)
        debug.print str
    End If
end with

使用工作表函数来解析子字符串。

with application.worksheetfunction
    str = .replace(str, 1, .search(d, str) + len(d), vbnullstring)
    str = trim(.replace(str, .search(d, str), len(str), vbnullstring))
    debug.print str
end with

'alternate
with application.worksheetfunction
    str = trim(mid$(.substitute(str, d, space(len(str))), len(str), len(str)))
    debug.print str
end with

所以看来您真的看起来并不那么难。

答案 1 :(得分:0)

我自己想出了一种解决方法,希望它可以帮助其他人。 此代码查找字符串的最后一个外观,获取其地址,然后从该特定单元格从下到上复制所选范围。 感谢那些尝试提供帮助的人:)

Option Explicit

公共Sub buscaIntervaloDinamico()     Dim sPalavra As String     昏暗的Termo作为范围

sPalavra = "Grupo: 1 - Ativos"

Set rngTermo = Range("C1:E999").Find(what:=sPalavra, After:=Range("C1"), _
searchorder:=xlByColumns, searchdirection:=xlPrevious)

rngTermo = rngTermo.Address
rngTermo = Range(ActiveCell, ActiveCell.EntireColumn.Cells(5, -1)).Copy

结束子

答案 2 :(得分:-3)

此链接可以帮助您: https://www.access-programmers.co.uk/forums/showthread.php?t=181399

在这里,2009年10月16日的原子虾写道:

  

假设我们有一个名为strInput的字符串,其中包含:
  123456789#banana#987654

     

InStr(strInput,“#”)返回10,因此我们知道#的第一个实例的位置

     

InStrRev(strInput,“#”)返回17,因此我们知道##p的最后一个实例的位置      

因此InStrRev(strInput,“#”)-InStr(strInput,“#”)为您(或多或少)您要提取的位的长度

     

Mid(strinput,InStr(strinput,“#”),InStrRev(strinput,“#”)-InStr(strinput,“#”))返回'#banana'-因此我们需要从一个位置开始:

     

Mid(strinput,InStr(strinput,“#”)+ 1,InStrRev(strinput,“#”)-InStr(strinput,“#”))返回'banana#'-因此我们需要提取部分短一个字符:

     

Mid(strinput,InStr(strinput,“#”)+ 1,InStrRev(strinput,“#”)-InStr(strinput,“#”)-1)似乎可以工作...

     

但是,如果您传递它:123456789#banana#0000#apple#987654,它将返回“ banana#0000#apple”,并且如果传递的字符串少于两个#字符,它就会掉落。 ..