2015-02-16 6 views
1

В Excel У меня есть макрос, который преобразует все столбцы активного листа в новый лист под названием «MasterList»Excel Добавить лист или перезапись, если Exists

Моя проблема в том, когда я повторно запустить этот макрос я получаю сообщение об ошибке говорящее "Это имя уже занято." Попробуйте другой.

Мне нужен мой макрос, чтобы переписать лист MaterList, если он уже существует.

Вот мой код:

Sub ToArrayAndBack() 
Dim arr As Variant, lLoop1 As Long, lLoop2 As Long 
Dim arr2 As Variant, lIndex As Long 

'turn off updates to speed up code execution 
With Application 
    .ScreenUpdating = False 
    .EnableEvents = False 
    .Calculation = xlCalculationManual 
    .DisplayAlerts = False 
End With 


ReDim arr2(ActiveSheet.UsedRange.Cells.Count - ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).Count) 

arr = ActiveSheet.UsedRange.Value 


For lLoop1 = LBound(arr, 1) To UBound(arr, 1) 
    For lLoop2 = LBound(arr, 2) To UBound(arr, 2) 
     If Len(Trim(arr(lLoop1, lLoop2))) > 0 Then 
      arr2(lIndex) = arr(lLoop1, lLoop2) 
      lIndex = lIndex + 1 
     End If 
    Next 
Next 

Sheets.Add.Name = "MasterList" 

Range("A1").Resize(, lIndex + 1).Value = arr2 

Range("A1").Resize(, lIndex + 1).Copy 
Range("A2").Resize(lIndex + 1).PasteSpecial Transpose:=True 
Rows(1).Delete 

With Application 
    .ScreenUpdating = True 
    .EnableEvents = True 
    .Calculation = xlCalculationAutomatic 
    .DisplayAlerts = True 
End With 


End Sub 
+1

Только предложение: вы не можете просто удалить его, если он существует и воссоздать его? – user1274820

+0

Я не думаю, что смогу, так как я свяжу его с MS Access. – Bigotacon

ответ

1

Вы можете поместить создание листа между об ошибке резюме и Гота ошибке 0. Другим решением является цикл по коллекции рабочих книг листов и проверить, если лист с этим имя существует.

Решение 1:

On Error Resume Next 
Sheets.Add.Name = "MasterList" 
On Error GoTo 0 

Решение 2:

Dim ws As Worksheet 
Dim found As Boolean 
found = False 
For Each ws In ThisWorkbook.Sheets 
    If ws.Name = "MasterList" Then 
     found = True 
     Exit For 
    EndIf 
Next 
If Not found Then 
    Sheets.Add.Name = "MasterList" 
EndIf 

Чтобы не полагаться на то, что MasterList активен:

Set ws = ThisWorkbook.Sheets("MasterList") 
With ws 
    .Range("A1").Resize(, lIndex + 1).Value = arr2 

    .Range("A1").Resize(, lIndex + 1).Copy 
    .Range("A2").Resize(lIndex + 1).PasteSpecial Transpose:=True 
    .Rows(1).Delete 
End With 
+0

Tarik, спасибо за совет. Я новичок в VBA. Не могли бы вы показать мне, как будет выглядеть решение в моем коде? – Bigotacon

+0

Решение 1. Сначала создается лист с именем MasterList, затем создается новый лист. Мне нужны данные из столбцов, чтобы они всегда попадали в MasterList. – Bigotacon

+0

Решение 2. Преобразует все столбцы в первый столбец активного листа (то есть лист OrderNumbers not MasterList). Это хорошо, но не совсем то, что мне нужно для моего кода. – Bigotacon