InStrRev没有给出正确的结果

时间:2014-01-17 21:50:23

标签: ms-access access-vba

我有一个Access数据库,我正在以CSV格式从JabRef导入书籍/期刊发布数据。 当我将数据导入Access时,发生的奇怪事情之一是页码在它们之间被赋予两个连字符,因此Access中“pages”列中的数据看起来像“200--213”

我需要能够计算引用的页数。

为了做到这一点,我在表单上的未绑定文本框中执行以下操作:

我在“pages”列中找到字符串的长度(必须重命名pages变量,因为它是pagesset的保留名称):PLen = Len([pagesset])

我找到从左边到“ - ”发生的字符数:LPageVar = InStr([pagesset],“ - ”)

我找到从右到“ - ”的字符数:RPageVar = InStrRev([pagesset],“ - ”)

我在“ - ”的左侧找到实际的页码:LVal = Left([pagesset],[LPageVar] -1)

我在“ - ”的右侧找到实际的页码:RVal = Right([pagesset],[RPageVar] -1)

我计算出现的页数:Pgcnt = RVal - LVal

一切似乎都有效...除非“InStrRev”击中一个项目,将数字增加10或100点,如下所示:“7--11”,“7--23”或“92 --101“而不是:”102--123“或”103-110“(这不会引起任何问题)。当它击中这些较短的页面时,RPageVar太低了1。

对于右边的每个项目,RVal似乎删除了第一个字符...所以对于“7--11”,最后一页报告为1或“7--23”它将报告最后一页如3或“92--101”,最后一页报告为01.这会导致这些特定页面计数为负。

有没有人知道为什么我会这样做?

2 个答案:

答案 0 :(得分:1)

InStrRev()从字符串的末尾搜索,但它返回的位置是相对于字符串的开头,而不是结尾。所以,

s = "this is a test--1"
Debug.Print InStrRev(s,"--")

显示15和

Right("this is a test--1",15)

显然不会在字符串末尾隔离“1”。这将通过

完成
Mid(s,InStrRev(s,"--")+2)

或者,在字符串

中只有"--"的一个实例的情况下
Mid(s,InStr(s,"--")+2)

也可以。

答案 1 :(得分:1)

这是一种不同的方法,对我来说不那么混乱;但不确定是否会让其他人感到困惑。

? PageCount("200--213")
 14 
? PageCount("7--11")
 5 

Function PageCount(ByVal pIn As String) As Long
    Dim astrPageRange() As String
    astrPageRange = Split(pIn, "--")
    PageCount = (Val(astrPageRange(1)) - Val(astrPageRange(0))) + 1
End Function