对于空单元格,IsNumeric函数返回true

时间:2013-08-14 07:19:31

标签: excel excel-vba acrobat isnumeric vba

我运行一个宏来复制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

3 个答案:

答案 0 :(得分:3)

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

例如,尝试下面的代码

它建立活动工作表中使用的Range然后遍历检查每个单元格的长度(len())

你可以在VBE中查看立即窗口 CTRL + G 以查看哪些单元格地址为空 等到宏完成执行后,您将收到一个消息框欢迎您说明有多少空单元格在

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

finished

答案 1 :(得分:2)

我现在用一个空单元格检查它(根本没有涉及PDF文件),你是对的:IsNumeric为空单元格返回True

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

Dim valIsNumeric As Boolean
If (Not IsEmpty(Range("A1"))) Then
    valIsNumeric = IsNumeric(Range("A1"))
End If

或者更通用的版本(在任何情况下都可以使用任何类型的字符串高度可靠):

If (Len(Trim(Range("A1").Value))) Then
    valIsNumeric = IsNumeric(Range("A1"))
End If

确保给定的单元格/字符串不是空白只代表一小部分代码,并且显着提高了任何方法的可靠性。

答案 2 :(得分:0)

这是一种骇人听闻的解决方案,但它是一个简单的解决方案。

由于“ IsNumeric(p变体)”使用了变体,因此可以在输入参数后附加“-”。这意味着null会被解释为不是数字的“-”,其中,真数字将被视为负数,从而满足真正成为数字的条件。 (尽管现在为负)

IsNumeric(“-”&string_Value) IsNumeric(str_Value)