VBA Если столбцы AC-AF содержат пробелы - PullRequest
0 голосов
/ 03 июля 2018

Я только начал изучать VBA меньше недели назад, поэтому я очень неопытен и могу действительно помочь! Я пытался автоматизировать некоторые процессы, и я смог понять довольно много. Однако некоторые вещи, похоже, не работают для меня, несмотря на проведенное мной исследование. Если кто-то не против помочь мне и объяснить, где я иду не так. Я уверен, что моя проблема с непониманием кодирования.

То, что я пытаюсь сделать, это: Если какие-либо ячейки в столбцах AC-AF на всей моей рабочей таблице (желательно, чтобы код соответствовал количеству строк, поскольку это никогда не будет прежним), оставьте пустыми, обрежьте всю строку и вставьте в новую рабочую таблицу с надписью «MissingShipping»

Из других примеров, которые я видел, я не понимаю, куда вставить диапазон ячеек, через которые я хочу пройти? Я также продолжаю получать сообщение об ошибке «Метод« Диапазон »объекта object__Worksheet» в строке: «NewSetup.Range (Cells (Destinationrow, 1), Cells (Destinationrow, lastcolumn)). Выберите». Если кто-то может помочь мне разобраться Я был бы очень признателен!

Option Explicit
Sub Shipping()
Dim MissingShipping As Worksheet
Set MissingShipping = Sheets.Add(After:=Sheets(Sheets.Count))
   MissingShipping.Name = "MissingShipping"
Dim NewSetup As Worksheet
Dim lastcolumn As Integer
Dim Destinationrow As Integer
Dim lastrow As Long
Set NewSetup = Worksheets("NKItemBuildInfoResults")
Set MissingShipping = Worksheets("MissingShipping")
Destinationrow = 1
lastcolumn = NewSetup.Range("XFD1").End(xlToLeft).Column
lastrow = NewSetup.Range("A1048576").End(xlUp).Row
Dim i As Long
Dim j As Long
For i = lastrow To 1 Step -1
For j = 1 To lastcolumn
   If NewSetup.Cells(i, j).Value = "" Then
NewSetup.Activate
   NewSetup.Range(Cells(i, 1), Cells(i, lastcolumn)).Cut
MissingShipping.Activate
   NewSetup.Range(Cells(Destinationrow, 1), Cells(Destinationrow, _
     lastcolumn)).Select
ActiveSheet.Paste
NewSetup.Rows(i).Delete shift:=xlUp
   Destinationrow = Destinationrow + 1
Exit For
   End If
     Next j
       Next i
End Sub

1 Ответ

0 голосов
/ 04 июля 2018

G'day Nikki,

Добро пожаловать в мир VBA! В Интернете есть множество полезных ресурсов, которые помогут вам в вашем путешествии.

Часто проще и быстрее работать с диапазоном внутри кода, а не читать и записывать на лист и выбирать ячейки, чтобы имитировать то, что вы обычно делали бы, если бы выполняли работу вручную.

Это хорошая идея, чтобы на ранних стадиях обвести голову. Это удобно для работы с несколькими листами.

Следующее является хорошим началом для диапазонов в Excel:

https://excelmacromastery.com/excel-vba-range-cells/

Еще одна удобная вещь - это коллекция. Если вам нужно было сохранить кучу вещей для работы позже, вы можете добавить их в коллекцию, а затем выполнить итерацию по ним, используя цикл «Для каждого». Это хорошее объяснение коллекций:

https://excelmacromastery.com/excel-vba-collections/

Я быстро взглянул на ваш код и, используя концепцию Ranges и Collections, я изменил его, чтобы сделать то, что, по вашему мнению, вы пытались сделать. Я должен был сделать несколько предположений, так как я не видел вас. Я запустил код на нескольких случайных строках на своем компьютере, чтобы убедиться, что он работает. Учтите следующее:

Dim MissingShipping As Worksheet
Dim NewSetup As Worksheet

Dim rangeToCheck As Range
Dim cellsToCheck As Range
Dim targetRange As Range
Dim rw As Range 'rw is a row
Dim cl As Range 'cl is a cell

Dim rowColl As New Collection

Dim i As Long

Set NewSetup = Worksheets("NKItemBuildInfoResults")
Set MissingShipping = Worksheets("MissingShipping")

'Get the range of data to check
Set rangeToCheck = NewSetup.Range("A1").CurrentRegion

'For each row in the range
For Each rw In rangeToCheck.Rows

    'For the last four cells in that row
    Set cellsToCheck = rw.Cells(1, 29).Resize(1, 4)

    For Each cl In cellsToCheck.Cells

        'If the cell is empty
        If cl.Value = "" Then

            'Add the row to our collection of rows
            rowColl.Add rw

            'Exit the for loop because we only want to add the row once.
            'There may be multiple empty cells.
            Exit For

        End If

    'Check the next cell
    Next cl

Next rw

'Now we have a collection of rows that meet the requirements that you were after

'Using the size collection of rows we made, we now know the size of the range 
'we need to store the values
'We can set the size of the new range using rowColl.Count 
'(that's the number of rows we have)
Set targetRange = MissingShipping.Range("A1").Resize(rowColl.Count, 32)

'Use i to step through the rows of our new range
i = 1

'For each row in our collection of rows
For Each rw In rowColl

    'Use i to set the correct row in our target range an make it's value 
    'equal to the row we're looking at
    targetRange.Rows(i) = rw.Value

    'Increment i for next time
    i = i + 1

Next rw

End Sub

Удачи! Надеюсь, это поможет.

...