2013-08-14 2 views
3

Я запускаю макрос, который копирует таблицы из файла PDF и сохраняет их в Excel. В некоторых таблицах содержатся пустые ячейки, и в моем анализе мне нужно знать количество ячеек, которые пусты. У меня есть функция, которая выполняет итерацию через каждый столбец, чтобы проверить, является ли значение внутри этой ячейки числовым или нет. проблема в том, что я запускаю эту функцию в пустой ячейке, она возвращает true. Я даже пытался вручную наклеить ячейки с помощью функции Isblank(), и он возвращает «false». (если я попробую это на любой ячейке вне вложенного диапазона, она вернет «true»)Функция IsNumeric возвращает 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 
+0

Вы пытаетесь использовать 'IsDBNull'? которые возвращают true или false? –

+0

Я не уверен, как использовать «IsDBNull», но я использовал «IsNull», и он возвращает false – user2681358

+0

, когда я использую «IsDBNull». Я получаю подфункцию или функцию не определен – user2681358

ответ

2

Есть случаи, когда лучше проверить length персонажей внутри клеток вместо использования isNumeric(), или проверить на наличие ошибок и т.д. ...

Например попробуйте следующий код

его устанавливает диапазон, используемый в активном листе затем итерацию проверки длины (LEN()) каждой ячейки

вы можете посмотреть на Immediate Window CTRL + G в VBE, чтобы увидеть, какие ячейки адреса пустыеилиждать, пока макрос не закончит выполнение, и вы будете приветствовать с Box сообщение о том, сколько пустых ячеек в диапазоне

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

+0

Оставь один с 9-секундным отставанием! :) Я +1 ваш, потому что (как и мой), хотя он больше завершен (я бы не написал, если бы вы были на 10 секунд быстрее). – varocarbas

+0

@varocarbas спасибо. Вы правы, оба ответа верны. так что оба заслуживают +1 –

+0

Спасибо man, я не уверен, как работает stackoverflow, но я проголосовал за оба ответа – user2681358

1

Я проверил его в пустую ячейку прямо сейчас (без участия файла 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 

Убедившись, что данная ячейка/строка не пустая представляет собой лишь небольшой фрагмент кода и значительно возрастает надежность любого подхода.

+0

Большое спасибо 'IsEmpty' также возвращает false, но len (trim()) работает нормально. Мне все равно придется протестировать, но похоже, что он решен – user2681358

+0

@ user2681358 Это довольно странно, насколько я не замечал проблемы с IsEmpty при работе с ячейками (я понимаю, что вы используете его с ячейкой Excel) , В любом случае вы всегда можете использовать «Len (Trim (« версия для строк »(те, которые вы берете из PDF, например). – varocarbas

Смежные вопросы