Цикл, чтобы найти ячейку, затем используя эту ссылку ячейки, чтобы очистить диапазон - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь написать код, который будет искать в первых 30 столбцах и строках слова Total и Area. Я хочу сохранить расположение этих слов в переменной, а затем использовать эти переменные, чтобы очистить диапазон, относящийся к ним, и тогда он будет проходить по всем рабочим листам.

Я пытался использовать преобразователь цифр в буквы, который я нашел в Интернете, для хранения номера столбца, и я думаю, что именно в этом и заключается моя проблема.

Вот код, который я нашел онлайн:

Function Col_Letter(lngCol As Long) As String
    Dim vArr
    vArr = Split(Cells(1, lngCol).Address(True, False), "$")
    Col_Letter = vArr(0)
End Function

и мой код:

Private Sub Clear_Click()
    Dim LastRowH As Integer
    Dim ClearContent As Boolean
    Dim ws As Worksheet
    Dim testrange As Range
    Dim Cell1 As Range
    Dim Celln As Range
    ClearContent = False
    For Each ws In ActiveWorkbook.Worksheets
        'FINDS RANGE
        For i = 1 To 30
            For j = 1 To 30
                If ActiveWorkbook.Sheets(ws).Range(Col_Letter(CLng(i)) & j).Value = "Total" Then
                    Cell1 = ws.Range(Col_Letter(CLng(i + 1)) & j)
                End If
                If ActiveWorkbook.Sheets(ws).Range(Col_Letter(CLng(i)) & j).Value = "Area" Then
                    Celln = ws.Range(Col_Letter(CLng(i + 1)) & j - 1)
                End If
            Next
        Next
        '...<more code here>...
        If ClearContent = True Then
            '...<more code here>...
            ws.Range(Cell1 & ":" & Celln).ClearContents
        End If
    Next ws
End Sub

Когда я запускаю код, я получаю сообщение об ошибке:

Ошибка времени выполнения '13': несоответствие типов

Я пробовал пару других методов, но не могу заставить его работать.

Любая помощь приветствуется, заранее спасибо:)

UPDATE Я попытался заменить циклы for в коде, чтобы использовать функцию «Ячейки», следующим образом:

For i = 1 To 30
            For j = 1 To 30
            If Sheets(ws).Cells(j, i).Value = "Total" Then
                    Set Cell1 = ws.Cells(j - 1, i + 1)
                End If
                If Sheets(ws).Cells(j, i).Value = "Area" Then
                    Set Celln = ws.Cells(j, i + 1)
                End If
            Next
        Next

Но я все еще получаю Несоответствие типов

1 Ответ

0 голосов
/ 08 сентября 2018

Ваше несоответствие типов связано с ActiveWorkbook.Sheets(ws).Range ws - это рабочий лист, а не индекс или имя. ws.range будет сканировать диапазоны этого листа. Несколько других модификаций были сделаны, см. Комментарии.

Function Col_Letter(lngCol As Long) As String
    Dim vArr
    vArr = Split(Cells(1, lngCol).Address(True, False), "$")
    Col_Letter = vArr(0)
End Function

Sub test()
    Dim LastRowH As Integer
    Dim ClearContent As Boolean
    Dim ws As Worksheet
    Dim testrange As Range
    Dim Cell1 As Range
    Dim Celln As Range
    ClearContent = False
    For Each ws In ActiveWorkbook.Worksheets
        'FINDS RANGE
        For i = 1 To 30
            For j = 1 To 30
                If ws.Range(Col_Letter(CLng(i)) & j).Value = "Total" Then
                    Set Cell1 = ws.Range(Col_Letter(CLng(i + 1)) & j)  ' Set This
                End If
                If ws.Range(Col_Letter(CLng(i)) & j).Value = "Area" Then
                    Set Celln = ws.Range(Col_Letter(CLng(i + 1)) & j - 1)  ' Set This
                End If
            Next
        Next
        '...<more code here>...
        'ClearContent = True    ' Me Testing
        If ClearContent = True Then
            '...<more code here>...
            Cell1.ClearContents
            Celln.ClearContents

            'ws.Range(Cell1 & ":" & Celln).ClearContents  ' don't think this will work properly
        End If
    Next ws
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...