Excel VBA - проблема удаления строки / столбца из неверной книги - PullRequest
0 голосов
/ 12 сентября 2018

Этот код копирует данные из рабочего листа и вставляет данные в файл test.csv.Если test.csv закрыт, он открывает его и вставляет в него данные.Если он уже открыт, просто вставьте в него данные.До этого шага процесс работает нормально.После того, как данные вставлены в test.csv, мне нужно удалить строки с первым столбцом со значением «Old».А затем удалите весь столбец "A".

Вот проблема, с которой я сталкиваюсь.Если test.csv закрыт, макрос открывает его, вставляет данные, а затем удаляет строки и столбцы и работает, как и ожидалось, однако, если test.csv уже открыт, он вставляет значения, как предполагаетсяк, но удаляя строки и столбцы это делает в основном листе.Я попытался поместить код удаления в с блоком, но это не помогает.Пожалуйста, предложите!

Sub Macro()
    Dim LR As Long, PR As Long, X As Long, MyCopyRange, MyPasteRange
    Dim wb, myData As Workbook, shtPaste As Worksheet

    Set wb = ThisWorkbook
     'open target csv file if not already opened
    If CheckFileIsOpen("test.csv") = False Then
        Set myData = Workbooks.Open(strFinalizedForBulkImport & "test.csv")
    Else
        Set myData = Workbooks("test.csv")
    End If
    Set shtPaste = myData.Sheets("test")
    shtPaste.UsedRange.Clear

   With wb.Sheets("Report Grp")

        LR = .Range("A" & .Rows.Count).End(xlUp).Row
        MyCopyRange = Array("A4:A" & LR, "B4:B" & LR, "C4:C" & LR, "D4:D" & LR) 'Put ranges in an array
        MyPasteRange = Array("A1", "B1", "C1", "D1")



        If LR > 1 Then
            j = 0
            For X = LBound(MyCopyRange) To UBound(MyCopyRange) 'Loop the array copying and pasting based on element in the array
                .Range(MyCopyRange(j)).Copy
                 shtPaste.Range(MyPasteRange(j)).PasteSpecial xlPasteValuesAndNumberFormats
                j = j + 1
            Next

        Else
            Range("A1") = "No Data Found"
        End If

    End With

'Problem here, when trying to delete row with "Old" in Col "A" and finally Col "A" delete -
        With wb.Sheets("test")
            For LR = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
                If Range("A" & LR).Value = "Old" Then
                    Rows(LR).EntireRow.Delete
                End If
            Next LR
            Columns("A").Delete Shift:=xlShiftToLeft
        End With
End Sub

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

В дополнение к квалификации всех диапазонов и других зависимых от листа объектов, таких как @Davesexcel, которые вы уже опубликовали, вы должны Set wb = ActiveWorkbook вместо Set wb = ThisWorkbook.Последнее относится к книге, в которой хранится макрос, тогда как вы, вероятно, намереваетесь использовать активную книгу.

Для отладки запустите редактор VBA (ALT + F11) и установите точку останова в первой строке цикла удаления.Проверьте имя рабочей книги wb относится к ("? Wb.name").Сделайте сравнение независимым от регистра, используя If UCase(.Range("A" & LR).Value) = "OLD" Then.
Если вы выполните один шаг одного цикла, вы поймете, почему ничего не удалено.

0 голосов
/ 12 сентября 2018

При использовании with все, что связано с этим листом, должно быть квалифицировано с периодом

With wb.Sheets("test")
    For LR = .Range("A" & .Rows.Count).End(xlUp).Row To 1 Step -1
        If .Range("A" & LR).Value = "Old" Then
            .Rows(LR).EntireRow.Delete
        End If
    Next LR
    .Columns("A").Delete Shift:=xlShiftToLeft
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...