Удалить все содержимое, кроме первой строки для конкретных листов в Excel - PullRequest
0 голосов
/ 19 ноября 2018

Пожалуйста, помогите.У меня есть этот код здесь, и он работает для первого листа, однако, не выполняется на 2-м листе.Я думаю, что мне не хватает синтаксиса листа.спасибо.

Dim arrSheets As Variant, sht As Variant

arrSheets = Array("tl_1", "tl_2")
For Each sht In arrSheets
  Sheets(sht).UsedRange.Offset(1).ClearContents
Next sht

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Мои 2 цента: не полагайтесь на имена листа. Вместо этого работайте с их свойством (Name), как видно из редактора Visual Basic. Обратите внимание, что вы можете дать значимые имена самостоятельно вместо стандартных Sheet1..N. Таким образом, ваш код переживет изменения имен, как видно из Excel, на вкладках внизу.

Option Explicit

Public Sub DoTheClearThing()
    Dim loopVariant As Variant
    Dim loopWorksheet As Excel.Worksheet
    Dim worksheetsToConsider As Variant

    'Use the (Name) property, as seen from the Visual Basic Editor, of the worksheets you're interested in.
    'The array below is not a string array; it is an array of worksheet objects.
    worksheetsToConsider = Array(TL_1, TL_2)

    'The For's variable must be a Variant; you can then Set it to a variable of the Worksheet type and enjoy Intellisense.
    For Each loopVariant In worksheetsToConsider
        Set loopWorksheet = loopVariant
        loopWorksheet.UsedRange.Offset(1).ClearContents
    Next
End Sub

Вот как выглядят свойства листа (Name) в моей тестовой книге Excel: enter image description here

Из кода вашей рабочей книги вы можете напрямую взаимодействовать с объектами рабочей таблицы, используя их свойство (Имя). Избегайте ThisWorkbook.Worksheets("tl_1").SomeMethod и сразу используйте TL_1.SomeMethod. Кстати, свойство (Имя) листа может быть прочитано кодом с использованием его свойства CodeName.

0 голосов
/ 20 ноября 2018

Worksheet.UsedRange не всегда возвращает правильный адрес.Рассмотрим результаты теста ниже:

UsedRange Test

Диапазон использованных испытаний

Sub Test()
    Application.ScreenUpdating = False
    Dim cell As Range, target As Range

    Debug.Print "Data Range", "|"; "UsedRange"
    Debug.Print String(24, "_")

    With Worksheets.Add
        Set target = .Range("B2:D2")
        target.Value = 1
        Debug.Print target.Address, "|"; .UsedRange.Address
    End With

    With Worksheets.Add

        .Range("A1:G10").Interior.Color = 65535
        Set target = .Range("B2:D2")
        target.Value = 1

        Debug.Print target.Address, "|"; .UsedRange.Address
    End With

End Sub

Очистить не заголовки

Sub ClearNonHeaderRows()
    Dim arrSheets As Variant, sht As Variant
    Dim cell As Range
    arrSheets = Array("tl_1", "tl_2")
    For Each sht In arrSheets
        With Worksheets(sht).UsedRange
            Set cell = .Find("*", .Cells(1, 1))
            If Not cell Is Nothing Then
                cell.Offset(1).Resize(.Cells.Rows.Count - cell.row + .Cells(1, 1).row).EntireRow.ClearContents
            End If
        End With
    Next sht

End Sub
0 голосов
/ 19 ноября 2018
Option Explicit
'This will do something to your target sheets, 
'just make sure your "something" is what you want

Dim N As Long
Dim wsName As String

'Optional if included
For N = 1 To ThisWorkbook.Sheets.Count
    wsName = ThisWorkbook.Worksheets(N).Name
    If wsName = "tl_1" or wsName = "tl_2" Then
        ThisWorkbook.Worksheets(N).UsedRange.Offset(1).ClearContents
    Else 'Do Nothing
    End If
Next N

Примечание: это очень зависит от имени листа, и пользователи могут изменить их, если вы не единственный пользователь.Возможно, вы захотите присвоить CodeName свои листы (Свойства обозревателя и изменить имя), а затем потяните CodeName.

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

-WWC

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