2015-08-10 6 views
0

Я пытаюсь создать макрос, который займет конкретный рабочий лист в моей книге , пройти через определенную строку, и если ячейка явно равна 0, удалите этот столбец и следующие четыре столбца справа.VBA Excel - удалять столбцы, если ячейка явно равна нулю

У меня мало опыта работы с VB, поэтому я изо всех сил пытаюсь обнять его.

Любая помощь была бы принята с благодарностью.

Это код, который я до сих пор:

Sub SaveAsW() 

Dim strFilename As String 
Dim strpath As String 
Dim curCell As Range 
Dim TempValue, ColNr, RowNr, SecCol 

RowNr = 35 

strpath = Sheets("Rebooking Calculations").Range("AK9").Text 
strFilename = Sheets("Ticket Input").Range("M10").Text 

ThisWorkbook.Sheets("Tickets (1-48)").Copy 
With ActiveWorkbook 
    For ColNr = 8 To 320 
     TempValue = Cells(RowNr, ColNr) 
     If (Application.IsNumber(TempValue)) And TempValue.Value = 0 Then 
      For SecCol = 1 To 4 
       Cells.EntireColumn.Delete 
      Next SecCol 
     End If 
    Next ColNr 
    .SaveAs strpath & "\" & strFilename & "(1-48)" & ".xls" 
    .Close 0 
End With 

UPDATE:

ж/помочь в этом, как я решить мою проблему.

ThisWorkbook.Sheets("Tickets (1-48)").Copy 
With ActiveWorkbook 
    For ColNr = 8 To 250 
     If Cells(RowNr, ColNr - 1) = "0" Then 
      TempValue = Cells(RowNr, ColNr - 1) 
      If TempValue = "0" Then 
       For i = 0 To 9 
        Cells(RowNr, ColNr - 1).Select 
        Cells(RowNr, ColNr - 1).EntireColumn.Delete 
       Next i 
      ColNr = ColNr - 1 
      Else 
      End If 
     Else 
     End If 
    Next ColNr 
    .SaveAs strpath & "\" & strFilename & "(1-48)" & ".xls" 
    .Close 0 
End With 

Thanks. (NB: Я в конечном итоге того, чтобы удалить следующие 9 столбцов, следовательно, цикл)

+0

Мог бы вы предоставить некоторые тестовые данные? – Cleb

+0

Мы знаем ваше требование. Как насчет кода? Это работает или дает ошибку? Если дать ошибку, скажите строку, которая дает ошибку. –

+0

Почему так много голосов? И здесь нет необходимости в тестовых данных, требование довольно ясное, а код довольно близок, поэтому просто исправляйте и указывайте ошибки или неточности в нем ... – R3uK

ответ

0

Это было хорошее начало, но есть некоторые проблемы в вашем коде:

Первая, при удалении строк или столбцов, его обычно проще уменьшить вашу переменную, чтобы избежать пропущенных строк/столбцов, поскольку они будут сдвигаться при ее удалении (то есть столбец (i + 1) станет столбцом (i) после удаления начального столбца (i), и вы увеличите (i + 1) и пропустить начальную (i + 1) перезагрузку при начальной (i + 2)).

Так что измените свою петлю, чтобы этого избежать.

Идея временной переменной для повышения эффективности была хорошей, но я думаю, что тест IsNumber(TempValue) не будет работать, поскольку вы назначили его переменной, которая набрана, поэтому лучше работать непосредственно с ячейками ,

Финли, то Cells.EntireColumn.Delete будет более точным, если ваши указать конкретную ячейку с строкой и столбцом или непосредственно удалить 5 столбцов без зацикливания, см исправленного кода:

Sub SaveAsW() 

Dim Ws As Worksheet, _ 
    strFilename As String, _ 
    strPath As String, _ 
    ColNr As Integer, _ 
    RowNr As Integer 

RowNr = 35 

strPath = Sheets("Rebooking Calculations").Range("AK9").Text 
strFilename = Sheets("Ticket Input").Range("M10").Text 

Set Ws = ActiveWorkbook.Sheets("Tickets (1-48)") 

With Ws 
    '.Copy 
    For ColNr = 320 To 8 Step -1 
     If (Application.IsNumber(.Cells(RowNr, ColNr))) And .Cells(RowNr, ColNr) = 0 Then 
      .Columns(ColNr & ":" & ColNr + 4).EntireColumn.Delete 
     End If 
    Next ColNr 
    .SaveAs strPath & "\" & strFilename & "(1-48)" & ".xls" 
    .Close 0 
End With 

Set Ws = Nothing 

End Sub 
+0

Благодарим за помощь. Извинения за то, что я не поставляю тестовую информацию - это сенсационно для моей работы, поэтому ее было трудно обеспечить. –

+0

Хорошо, никаких проблем, тестовые данные на самом деле не очень полезны большую часть времени и особенно на этот раз ... Просто подробно о том, что вы пытаетесь сделать, и в чем проблема. ** Если ответ помог вам решить вашу проблему, примите его, чтобы отметить вопрос как ответ **. (а затем, используйте вверх/вниз голосов, за каждое сообщение, которое вам полезно) – R3uK

Смежные вопросы