我需要在同一字符串之间复制一个范围,比方说,我需要在两次复制之间复制所有内容:
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
答案 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#987654InStr(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”,并且如果传递的字符串少于两个#字符,它就会掉落。 ..