Метод 'Range' объекта '_Global' не выполнен.ошибка - PullRequest
3 голосов
/ 13 октября 2011

Я пытаюсь заставить Excel выяснить, какие столбцы на рабочем листе пусты.В конце концов идея состоит в том, чтобы заставить его удалить полностью пустые столбцы.Вот код, который у меня есть:

Sub Macro2()
'
' Macro2 Macro
'
Dim totalCols As Integer
Dim totalRows As Integer

totalCols = ActiveSheet.UsedRange.Columns.Count
totalRows = ActiveSheet.UsedRange.Rows.Count

Dim i As Integer
Dim j As Integer
Dim numNull As Integer

For i = 1 To totalCols
    For j = 2 To totalRows
        Dim location As String
        location = "R" & i & ":" & "C" & j
        If Range(location).Select = "" Then
            numNull = numNull + 1
        End If
    Next j
    If numNull = totalRows - 1 Then
        MsgBox ("Column " & i & "is null")
    End If
Next i

End Sub

В конце он проверяет, есть ли numNull (количество пустых записей в строке) = totalRows минус заголовок.Я работал до утверждения If Range(location).Select = "".Теперь компилятор говорит:

Метод 'Range' объекта '_Global' не удалось

Кто-нибудь знает, что это значит или как я могу это исправить?

Ответы [ 2 ]

5 голосов
/ 13 октября 2011

Ваш код использует .Select, когда вы должны использовать .Value

Это может быть быстрее, хотя:

Sub Tester()

    Dim col As Range, ur As Range
    Dim numRows As Long, numCols As Long, i As Long, awf

    Set awf = Application.WorksheetFunction
    Set ur = ActiveSheet.UsedRange

    numRows = ur.Rows.Count
    numCols = ur.Columns.Count

    'edit: account for header row...
    Set ur = ur.Offset(1,0).Resize(numRows-1, numCols)
    numRows = numRows - 1

    For i = numCols To 1 Step -1
        Set col = ur.Columns(i)
        If awf.CountBlank(col) = numRows Then
            MsgBox "Column #" & col.Column & " is empty"
            'col.EntireColumn.Delete
        End If
    Next i

End Sub
2 голосов
/ 13 октября 2011

На данный момент «Range» не относится к экземпляру объекта. Класс Range таким образом не может использоваться статически - вам нужно создать экземпляр объекта Range, обычно вызывая метод фабрики соответствующего объекта. Возможно, есть другие способы сделать это, но я обычно называю ActiveSheet.Range.

Как отметил Тим Уильямс выше, вам, вероятно, следует использовать .Value, а не .Select; Я не совсем уверен, что .Select возвращает, ссылка MSDN просто говорит вариант типа данных.

Я не на машине с Windows, чтобы проверить, но попробуйте:

If ActiveSheet.Range(location).Value = "" Then

Ссылка на объект диапазона MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...