Excel IsNumeric函数为空单元格返回true

Excel IsNumeric函数为空单元格返回true,excel,acrobat,isnumeric,vba,Excel,Acrobat,Isnumeric,Vba,我运行一个宏,从PDF文件复制表格并将其保存在Excel中。 有些表格包含空单元格,在我的分析中,我需要知道空单元格的数量。 我有一个函数,它遍历每一列,检查该单元格中的值是否为数字。 问题是,当我在空单元格上运行此函数时,它返回true。我甚至尝试使用Isblank()函数手动检查单元格,结果返回“false”。(如果我在粘贴范围之外的任何单元格上尝试此操作,它将返回“true”) 我猜当我从PDF中复制和粘贴内容时,它会以某种方式为空单元格粘贴一些值 有没有人遇到过类似的问题?如果是的话,有

我运行一个宏,从PDF文件复制表格并将其保存在Excel中。 有些表格包含空单元格,在我的分析中,我需要知道空单元格的数量。 我有一个函数,它遍历每一列,检查该单元格中的值是否为数字。 问题是,当我在空单元格上运行此函数时,它返回true。我甚至尝试使用Isblank()函数手动检查单元格,结果返回“false”。(如果我在粘贴范围之外的任何单元格上尝试此操作,它将返回“true”)

我猜当我从PDF中复制和粘贴内容时,它会以某种方式为空单元格粘贴一些值

有没有人遇到过类似的问题?如果是的话,有什么办法可以解决吗

如果有任何帮助,这里是我用来复制和粘贴的代码

'Initialize Acrobat by creating App object
Set PDFApp = CreateObject("AcroExch.App")

'Set AVDoc object
Set PDFDoc = CreateObject("AcroExch.AVDoc")

'Open the PDF
If PDFDoc.Open(PDFPath, "") = True Then
    PDFDoc.BringToFront

    'Maximize the document
    Call PDFDoc.Maximize(True)

    Set PDFPageView = PDFDoc.GetAVPageView()

    'Go to the desired page
    'The first page is 0
    Call PDFPageView.GoTo(DisplayPage - 1)

    '-------------
    'ZOOM options
    '-------------
    '0 = AVZoomNoVary
    '1 = AVZoomFitPage
    '2 = AVZoomFitWidth
    '3 = AVZoomFitHeight
    '4 = AVZoomFitVisibleWidth
    '5 = AVZoomPreferred

    'Set the page view of the pdf
    Call PDFPageView.ZoomTo(2, 50)

End If

Set PDFApp = Nothing
Set PDFDoc = Nothing

On Error Resume Next

'Show the adobe application
PDFApp.Show

'Set the focus to adobe acrobat pro
AppActivate "Adobe Acrobat Pro"

'Select All Data In The PDF File's Active Page
SendKeys ("^a"), True

'Right-Click Mouse
SendKeys ("+{F10}"), True

'Copy Data As Table
SendKeys ("c"), True

'Minimize Adobe Window
SendKeys ("%n"), True

'Select Next Paste Cell
Range("A" & Range("A1").SpecialCells(xlLastCell).Row).Select
'Cells(1, 1).Select
'Paste Data In This Workbook's Worksheet
ActiveSheet.Paste

我现在已经用一个空单元格检查了它(根本不涉及PDF文件),您是对的:
IsNumeric
返回空单元格的
True

我从来没有遇到过这个问题,因为在编码时,我不想让内置函数“达到极限”(确定一个空单元格是否可以被视为数字,甚至可能值得讨论)。在对单元格(或一般字符串)执行任何类型的分析之前,我总是要确保它不是空的:

Dim valIsNumeric As Boolean
If (Not IsEmpty(Range("A1"))) Then
    valIsNumeric = IsNumeric(Range("A1"))
End If
或者在更通用的版本中(在任何情况下对任何类型的字符串都高度可靠):


确保给定的单元格/字符串不为空仅代表一小段代码,并显著提高了任何方法的可靠性。

在某些情况下,最好检查单元格中字符的大小,而不是使用
isNumeric()
,或检查错误等

例如,请尝试下面的代码

它建立活动工作表中使用的范围,然后通过检查每个单元格的长度(len())进行迭代

您可以查看VBE中的即时窗口CTRL+G,查看哪些单元格地址为空,或者等待宏执行完毕,系统将显示一个消息框,告诉您该范围内有多少空单元格

选项显式
副检查长(PTYCELLS)()
调暗lastCol As范围
设置lastCol=ActiveSheet.Cells.Find(What:=“*”,After:=ActiveSheet.Cells(1,1),LookIn:=xlFormulas_
LookAt:=xlPart,SearchOrder:=xlByColumns,SearchDirection:=xlPrevious,MatchCase:=False)
变暗rng As范围
设置rng=范围(“A1:”&最后列地址)
暗淡的碳纳米管
cnt=0
暗淡单元格作为范围
对于rng中的每个单元
如果Len(cell)<1,则
调试。打印单元格。地址
cnt=cnt+1
如果结束
下一个
MsgBox“有”&cnt&“范围内的空单元格”&rng.Address
端接头

这是一种黑客式的解决方案,但它是一种简单的解决方案

由于'IsNumeric(p variant)'使用变量,因此可以在输入参数后附加“-”。这意味着null将被解释为“-”,而“-”不是一个数字,其中作为一个实数将被视为一个负数,从而满足真正是一个数字的条件。(虽然现在是负数)


IsNumeric(“-”&string\u Value)IsNumeric(str\u Value)

您尝试过“IsDBNull”吗?返回true或false?我不知道如何使用“IsDBNull”,但我使用了“IsNull”,它返回false当我使用“IsDBNull”时,我得到子或函数未定义当我打开表格时,单击“ctrl G”并选择空白,这些单元格尽管为空,但不会突出显示。啊,来吧!有9秒的延迟!:)我+1你的,因为它是正确的(就像我的一样),虽然它更完整(如果你能快10秒我就不会写我的了)。@varocarbas谢谢。你是对的,两个答案都是正确的。所以这两个都值得+1谢谢,伙计,我不知道stackoverflow是如何工作的,但我把这两个都投了赞成票answers@user2681358感谢您的投票,欢迎来到stackoverflow。如果您对某个答案感到满意,您可以单击投票下方的绿色复选标记来接受答案-这就是我们在stackoverflow上说谢谢的方式。@user2681358这很奇怪:我投了1票,mehow投了1票。我比他高,他也比我高。。。我甚至不确定你是否有足够的声望去投票。无论如何您应该选择正确答案,因为Mehow指示您(通过单击左侧的勾号);我承认他的答案比我的更完整。非常感谢“IsEmpty”也返回false,但len(trim())似乎工作正常。我还得做测试,但看起来很好solved@user2681358这是相当奇怪的,因为我从来没有注意到在处理单元格时IsEmpty有问题(我知道您将它用于Excel单元格)。在任何情况下,您都可以使用“Len(Trim”(“用于字符串的版本”(例如,您从PDF中获取的字符串)。这是一个很好的解决方案。我需要在包含空格和“N/a”的数据集中检查数字。干得好。
If (Len(Trim(Range("A1").Value))) Then
    valIsNumeric = IsNumeric(Range("A1"))
End If
Option Explicit

Sub CheckForEmptyCells()

    Dim lastCol As Range
    Set lastCol = ActiveSheet.Cells.Find(What:="*", After:=ActiveSheet.Cells(1, 1), LookIn:=xlFormulas, _
              LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False)

    Dim rng As Range
    Set rng = Range("A1:" & lastCol.Address)

    Dim cnt As Long
    cnt = 0

    Dim cell As Range
    For Each cell In rng
        If Len(cell) < 1 Then
            Debug.Print cell.Address
            cnt = cnt + 1
        End If
    Next

    MsgBox "there are " & cnt & " empty cells within the range " & rng.Address
End Sub