Колонка не компенсируется

Sub Delete_Columns()
    Dim Last_Row As Integer
    Dim rnge As Range
    Dim celladdres As Variant
    Dim v As Integer

    Last_Row = Worksheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Row

    Cells(Last_Row, [13]).Value = "Sampling"
    Range("C3").Copy Range("C" & Last_Row)
    Range("B3").Copy Range("B" & Last_Row)
    Range("A3").Copy Range("A" & Last_Row)

    Set rnge = Range("G3:G1000").Find(what:="Description")
    rnge.Find what:="Description"

    celladdres = rnge.Offset(-1, 30).Address
    Range("a2", [celladdress]).Delete
End Sub

Привет, я пытаюсь сместить столбец и строку, когда описание, если обнаружено, удаляет все данные выше из предыдущего теста, но когда я смещаю его, строка движется вверх, но столбец не смещает 30, которые он должен. это не cmoin с какими-либо ошибками. Мне нужно установить букву в качестве значения, чтобы это работало? спасибо макс

2 ответа

  1. Убедитесь, что вы используете Option Explicit для обнаружения опечаток в переменных.

  2. Убедитесь, что каждый Range, Cells, Rows а также Colums объект имеет рабочий лист, указанный как ws.Range, в противном случае он будет использовать любой активный лист (который можно легко изменить щелчком мыши).

  3. Как вы можете видеть в документации к методу Range.Find, абсолютно необходимо указать следующие 4 параметра, иначе вы получите случайные результаты:

    Настройки для LookIn, LookAt, SearchOrder, а также MatchByteсохраняются каждый раз, когда вы используете этот метод. Если вы не укажете значения для этих аргументов при следующем вызове метода, будут использоваться сохраненные значения. Установка этих аргументов изменяет настройки в диалоговом окне "Найти", а изменение настроек в диалоговом окне "Найти" изменяет сохраненные значения, которые используются, если вы опускаете аргументы. Чтобы избежать проблем, явно задавайте эти аргументы каждый раз, когда вы используете этот метод.

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

  4. После использования Find() метод убедитесь, что вы проверили, было ли что-то найдено If Not FoundAt Is Nothing Then или это будет эрорр.

  5. В [ ] вы используете в [celladdress] не имеют ничего общего с [A1]обозначения и работают не так, как вы предполагали. Их нужно удалить!

  6. Объявите свои переменные как можно ближе к их первому использованию, а не на самом верху. В противном случае вы легко получите что-то вродеDim v As Integer и никогда не использую v во всем коде.

  7. Наконец, используйте правильное форматирование кода и правильный отступ. Чем легче читается код, тем меньше ошибок вы сделаете и тем легче будет его отлаживать. Не работайте, как "я исправлю форматирование позже". Это замедлит вас при написании хорошего кода и, вероятно, никогда не исправит это.

В итоге получается что-то вроде:

Option Explicit

Public Sub Example()
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet1") 'define your sheet
     
    Dim LastRow As Long
    LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Offset(1, 0).Row

    ws.Cells(LastRow, 13).Value = "Sampling"
    ws.Range("C3").Copy ws.Range("C" & LastRow)
    ws.Range("B3").Copy ws.Range("B" & LastRow)
    ws.Range("A3").Copy ws.Range("A" & LastRow)
     
    Dim FoundAt As Range 'define ALL these parameters below to prevent random/wrong results
    Set FoundAt = ws.Range("G3:G1000").Find(What:="Description", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchByte:=False)
    
    If Not FoundAt Is Nothing Then 'test if something was found you cannot delete if you found nothing
        Dim CellAddress As String
        CellAddress = FoundAt.Offset(-1, 30).Address
        ws.Range("A2", CellAddress).Delete
    Else
        MsgBox "'Description' was not found.", vbCritical
    End If
End Sub

Отбор проб

  • С этой небольшой информацией я мог придумать только это. Комментарии должны помочь вам изменить что-то, если что-то было неправильно понято.

Код

Option Explicit

Sub Sampling()
    
    ' Define worksheet.
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    
    ' Calculate 'NewRow', the row below last non-blank cell in column "A".
    Dim NewRow As Long
    NewRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Offset(1, 0).Row
    
    ' Write "Sampling" in column "M" of 'NewRow'.
    ws.Range("M" & NewRow).Value = "Sampling"
    ' Copy range "A3:C3" to the same columns in 'NewRow'.
    ws.Range("A3:C3").Copy ws.Range("A" & NewRow, "C" & NewRow)

    ' Find the first occurrence of "Description" in column "G"
    ' starting from the 3rd row and ending above 'NewRow'.
    Dim rng As Range
    Set rng = ws.Range("G3", "G" & NewRow - 1) _
                .Find(What:="Description", After:=ws.Range("G" & NewRow - 1), _
                      Lookin:= xlValues, LookAt:=xlWhole)
    ' Check if "Description" was not found.
    If rng Is Nothing Then Exit Sub
        
    ' Delete range 'A2:AK2' resized to the row above of
    ' where "Description" was found.
    ' First test with 'Select'.
    ' When tested, replace 'Select' with 'Delete'.
    ws.Range("A2", "AK" & rng.Row - 1).Select
              
End Sub
Другие вопросы по тегам