Колонка не компенсируется
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 ответа
Убедитесь, что вы используете
Option Explicit
для обнаружения опечаток в переменных.Убедитесь, что каждый
Range
,Cells
,Rows
а такжеColums
объект имеет рабочий лист, указанный какws.Range
, в противном случае он будет использовать любой активный лист (который можно легко изменить щелчком мыши).Как вы можете видеть в документации к методу Range.Find, абсолютно необходимо указать следующие 4 параметра, иначе вы получите случайные результаты:
Настройки для
LookIn
,LookAt
,SearchOrder
, а такжеMatchByte
сохраняются каждый раз, когда вы используете этот метод. Если вы не укажете значения для этих аргументов при следующем вызове метода, будут использоваться сохраненные значения. Установка этих аргументов изменяет настройки в диалоговом окне "Найти", а изменение настроек в диалоговом окне "Найти" изменяет сохраненные значения, которые используются, если вы опускаете аргументы. Чтобы избежать проблем, явно задавайте эти аргументы каждый раз, когда вы используете этот метод.Без определения этих параметров он может работать сейчас и перестать работать в другой раз.
После использования
Find()
метод убедитесь, что вы проверили, было ли что-то найденоIf Not FoundAt Is Nothing Then
или это будет эрорр.В
[ ]
вы используете в[celladdress]
не имеют ничего общего с[A1]
обозначения и работают не так, как вы предполагали. Их нужно удалить!Объявите свои переменные как можно ближе к их первому использованию, а не на самом верху. В противном случае вы легко получите что-то вроде
Dim v As Integer
и никогда не используюv
во всем коде.Наконец, используйте правильное форматирование кода и правильный отступ. Чем легче читается код, тем меньше ошибок вы сделаете и тем легче будет его отлаживать. Не работайте, как "я исправлю форматирование позже". Это замедлит вас при написании хорошего кода и, вероятно, никогда не исправит это.
В итоге получается что-то вроде:
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