2016-12-06 2 views
0

Если имя листа «Центральное» (с пробелом в конце слова), зона = «Центральная» возвращает ошибку, и лист не может быть активирован.Как установить строку для поиска листа

Как это исправить?

dim wb1, wb2, wb3 as workbook 
    set wb1 = activeworkbook 'the macro file 
dim ws1, ws2 as worksheet 
set ws1 = Sheets("Central Zone") 
set ws2 = Sheets("Eastern Zone") 

For x = 1 To 2 
    If x = 1 Then 
     Set ws = ws1 
     zone = "Central" 
    End If 
    If x = 2 Then 
     Set ws = ws2 
     zone = "East" 
    End If 


    wb2.Sheets(zone).Activate 'wb2 is source file 1. I have wb3, wb4, etc 
     Selection.EntireColumn.Hidden = False 
     Range("A1").Select 
     Selection.End(xlDown).Select 
     Range(Selection, Selection.End(xlUp)).Select 
     Selection.EntireRow.Select 
     Selection.Copy 
    wb1.Activate 
    ws.Activate 
     ActiveSheet.Paste 
     Application.CutCopyMode = False 
     Range("A1").Select 
     Selection.End(xlDown).Offset(1, 0).Select 
Next x 
+0

Определили ли вы зоны в виде строки с 'Dim зоны в виде строки ' –

+0

Да, у меня есть. Но проблема в том, что фактическое имя листа не является «Центральным», а «Центральным». –

+0

@AizatKassim вместо нас, угадывая, как вы определили 'ws', где и что такое' ws1', пожалуйста, разместите остальную часть своего кода здесь. –

ответ

0

Это ВСЕГДА рекомендуется держаться подальше от Activate, Selection, Select и всех других "родственников". Вместо этого используйте ссылочные объекты, например Sheets, и `Диапазоны.

Код ниже немного «быстрый и грязный», но это должно дать вам результат вы хотите

Код

Option Explicit 

Sub CopyCentralSheets() 

Dim wb1 As Workbook, wb2 As Workbook, wb3 As Workbook 
Dim ws1 As Worksheet, ws2 As Worksheet, Sht As Worksheet, ws As Worksheet 
Dim LastRow As Long, LastColumn As Long, PasteRow As Long, x As Long 

Set wb1 = ThisWorkbook ' this macro file 
'Set wb2 = Workbooks("temp.xlsx") 'for my debug tests only 

Set ws1 = wb1.Sheets("Central Zone") 
Set ws2 = wb1.Sheets("Eastern Zone") 

For x = 1 To 2 
    If x = 1 Then 
     For Each Sht In wb2.Worksheets 
      If Sht.Name Like "Central*" Then 
       Set ws = Sht 
      End If 
     Next Sht 
    Else 
     If x = 2 Then 
      For Each Sht In wb2.Worksheets 
       If Sht.Name = "East" Then 
        Set ws = Sht 
       End If 
      Next Sht 
     End If 
    End If 

    With ws 
     LastRow = .UsedRange.Rows(.UsedRange.Rows.Count).Row 
     LastColumn = .UsedRange.Columns(.UsedRange.Columns.Count).Column 
     .Range(.Cells(1, 1), .Cells(LastRow, LastColumn)).Copy     
    End With 

    If x = 1 Then 
     With ws1 
      PasteRow = .Cells(.Rows.Count, "A").End(xlUp).Row 
      .Range("A" & PasteRow + 1).PasteSpecial xlValues 
     End With 
    Else 
     If x = 2 Then 
      With ws2 
       PasteRow = .Cells(.Rows.Count, "A").End(xlUp).Row 
       .Range("A" & PasteRow + 1).PasteSpecial xlValues 
      End With 
     End If 
    End If 
Next x 

End Sub 
+0

Спасибо. Позвольте мне попробовать это, и я сообщу вам результат. –

+0

Мне пришлось внести некоторые изменения, чтобы заставить его работать с остальной частью моего кода. Он работал очень хорошо. Большое вам спасибо за коды! –

+0

@AizatKassim, пожалуйста, отметьте мой ответ как «ОТВЕТ» (поставьте немного ** V ** рядом с ним) –

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