Почему перед отбором нужно активировать листы Excel? Активировать лист excel vba


Активировать рабочий лист с помощью excel VBA

У меня есть файл «Workbook A» в папке. Обновленная версия отправляется мне каждые две недели. Я хочу открыть эту книгу из другой книги «Workbook B» и в то же время удалить пустые строки в «Workbook A».

Операции открытия и удаления будут выполняться с использованием макроса.

Это мой код.

Sub RemoveEmptyRows() ' this macro will remove all rows that contain no data ' ive named 2 variables of data type string Dim file_name As String Dim sheet_name As String file_name = "C:\Users\Desktop\Workstation_A\Workbook_A.xlsm" 'Change to whatever file i want sheet_name = "Worksheet_A" 'Change to whatever sheet i want ' variables "i" and "LastRow" are needed for the for loop Dim i As Long Dim LastRow As Long ' we set wb as a new work book since we have to open it Dim wb As New Workbook ' To open and activate workbook ' it opens and activates the workbook_A and activates the worksheet_A Set wb = Application.Workbooks.Open(file_name) wb.Sheets(sheet_name).Activate ' (xlCellTypeLastCell).Row is used to find the last cell of the last row ' i have also turned off screen updating LastRow = wb.ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row Application.ScreenUpdating = False ' here i am using a step ' the step is negative ' therefore i start from the last row and go to the 1st in steps of 1 For i = LastRow To 1 Step -1 ' Count A - Counts the number of cells that are not empty and the ' values within the list of arguments (wb..ActiveSheet.Rows(i)) ' Afterwards deleting the rows that are totally blank If WorksheetFunction.CountA(wb.ActiveSheet.Rows(i)) = 0 Then wb.ActiveSheet.Rows(i).EntireRow.Delete End If Next i ' used to update screen Application.ScreenUpdating = True End Sub

Имя листа работы содержит Worksheet_A как часть его имени, за которым следует дата. Например, Worksheet_A 11-2-15.

В моем коде, я присвоили переменной sheet_name к Worksheet_A

sheet_name = "Worksheet_A"

и далее вниз, я использовал

.Sheets(sheet_name).Activate

, чтобы активировать лист. Я чувствую, что есть проблема с ниже линии:

sheet_name = "Worksheet_A"

так sheet_name не совсем Worksheet_A он содержит только Worksheet_A как часть его имени.

Это вызывает проблему. Рабочая книга A открывается, но удаление пустых строк не происходит. Далее появляется сообщение об ошибке.

Ошибка времени выполнения 9: Подпись вне диапазона.

Как изменить код, чтобы рабочий лист активировался и выполнялись макрооперации?

excel vba excel-vba excel-2013 2,136

stackoverrun.com

vba - Почему перед отбором нужно активировать листы Excel?

@Daniel Cook: спасибо за ваш ответ, но, к сожалению, сам Excel не работает по тем же правилам, которые применяются к макросам Excel...

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

Я пытаюсь переустановить содержимое таблицы в общее состояние. Этот метод будет применяться к нескольким таблицам на разных листах:

Public Sub restoreTable() Dim myTableSheet As Worksheet: Set myTableSheet = Range("Table1").Parent Dim myTable As ListObject: Set myTable = myTableSheet.ListObjects("Table1") ' --- Clear Table Filter(s) If myTable.ShowAutoFilter Then ' table has auto-filters enabled Call myTable.Range.AutoFilter ' disables autofilter End If myTable.Range.AutoFilter ' re-apply autofilter ' --- Sort by Sequence number Call myTable.Sort.SortFields.Clear ' if not cleared, sorting will not take effect myTable.Sort. _ SortFields.Add Key:=Range("Table1[[#Headers],[#Data],[Column1]]"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal myTable.Sort.Header = xlYes myTable.Sort.Orientation = xlTopToBottom myTable.Sort.SortMethod = xlPinYin Call myTable.Sort.Apply myTable.Sort.SortFields.Clear End Sub

Для каждого случая использования ниже Table1 находится в Sheet1

Пример использования 1:

  • Активировать Sheet1, выбрать диапазон A1
  • Выполнить restoreTable
  • соблюдать: диапазон Sheet1 A1 остается выбранным

Пример использования 2:

  • Активировать Sheet1, выбрать диапазон A1
  • Активировать Sheet2
  • Выполнить restoreTable
  • : диапазон Sheet1 A1 выбран не, вместо этого выбирается диапазон Table1[#Data]

Решение

Это абсолютно ужасно, но это лучшее решение, которое я смог найти

Public Sub resotreTable_preserveSelection() Dim curSheet As Worksheet: Set curSheet = ActiveSheet Dim tableSheet As Worksheet: Set tableSheet = Range("Table1").Parent ' Change Sheet tableSheet.Activate ' Remember Selection / Active Ranges Dim originalSelection As Range: Set originalSelection = Selection Dim originalActiveCell As Range: Set originalActiveCell = ActiveCell ' Restore Table Call restoreTable ' Restore Old Selection originalSelection.Select originalActiveCell.Activate ' Change Back to old sheet curSheet.Activate End Sub

Примечание: в этом случае диапазоны original * не нужны, но вы получаете точку: вы можете буферизовать исходный выбор и восстановить его, когда закончите

Мне действительно не нравится excel

qaru.site

vba - Как избежать необходимости активировать рабочий лист в каждом цикле

Я установил некоторый код VBA в Excel, который просит пользователя выбрать второй лист, а затем ищет его для значения (общий ключ, связывающий два набора данных, нашел 6 столбцов после Rng, где я хочу добавьте полученное значение) во вторую таблицу и добавит значение из этой строки в столбец в исходной таблице. Часть программы, которую я хотел бы настроить, - это цикл ниже.

Он отлично работает, если я уйду в строку, чтобы активировать книгу CurFile. Но это означает, что мой экран много мигает между двумя книгами. И как только я начну попадать в сотни или тысячи строк данных, это будет смехотворно медленным.

Когда я прокомментирую эту строку, значение для FindCID не изменится, и похоже, что оно просто продолжает заполнять одну и ту же строку, даже если значение для r обновляется. Если после нескольких циклов я добавляю активирующую строку обратно, она возобновляет правильное заполнение результатов несколькими строками вниз.

Как я могу оптимизировать это? Первоначально я использовал ссылки на ThisWorkbook, но даже с явным определением CurFile (CurFile = ActiveWorkbook.Name) ранее он, похоже, не вернулся к этой книге, чтобы найти следующее значение для поиска, если только я не активирую лист.

Do While r <= maxRows With Workbooks(CurFile).Worksheets("Sheet1") Set Rng = .Range(Cells(r, c), Cells(r, c)) End With FindCID = Rng.Offset(0, 6).Value If Trim(FindCID) <> "" Then With Workbooks(FN) ' found earlier by a function .Activate End With With Sheets("Sheet1").Range("D:D") Set FoundCell = .Find(What:=FindCID) If Not FoundCell Is Nothing Then PathLen = FoundCell.Offset(0, 2).Value Workbooks(CurFile).Sheets("Sheet1").Activate 'If I comment out this line it doesn't work Rng.Value = PathLen MsgBox "CID found in " & FoundCell.Address & " Its value is " & PathLen Else MsgBox "Nothing found" End If End With End If On Error Resume Next r = r + 1 Loop

qaru.site

Защитить и отключить рабочие листы в Excel VBA

Защитить и снять защиту рабочего листа в Excel VBA полезна, когда мы работаем с шаблонами или некоторыми листами, структура которых не изменится, но данные могут измениться. Или мы можем ограничить пользователей не изменять структуру рабочего листа.

Защитить снять защиту рабочего листа в Excel VBA - Решение:

  Мы можем использовать методы защиты и снятие защиты рабочего листа для защиты и блокировки рабочих листов в Excel с помощью VBA.

Защитить снять защиту рабочего листа в Excel VBA - Примеры:

  В следующем примере показано, как защитить и снять защиту листов в Excel с помощью VBA.

Пример защиты рабочего листа Sub sbProtectSheet() ActiveSheet.Protect "password", True, True End Sub

  Здесь левая часть - это лист, который вы хотите защитить. первым параметром будет пароль: вы предоставляете любой пароль для защиты рабочего листа.

Пример снятие защиты рабочего листа Sub sbUnProtectSheet() ActiveSheet.Unprotect "password" End Sub

  Здесь левая часть - это рабочий лист, который вы хотите защитить, а правая сторона - это пароль для снятия защиты, который вы предоставили, защищая рабочий лист.

Инструкции:
  1. Откройте рабочую книгу Excel
  2. Нажмите Alt + F11, чтобы открыть редактор VBA.
  3. Вставьте модуль для меню вставки
  4. Создайте приведенный выше код и вставьте в окно кода
  5. Сохраните файл в виде макросъемки
  6. Нажмите F5, чтобы выполнить его

Защитить все рабочие листы в рабочей книге

  Мы можем защитить все рабочие листы в книге с помощью VBA. Если вы хотите ограничить все листы от пользователей, чтобы не изменять структуру, мы можем защитить все листы.

Защита всех рабочих листов в книге с помощью VBA - Решение:

  Мы можем использовать метод Protect и перебирать все рабочие листы в книге.

Защита всех рабочих листов в книге с помощью VBA - Пример:

  Ниже приведен пример кода, который покажет вам, как защитить все рабочие листы в книге с помощью VBA.

Код Sub sbProtectAllSheets() Dim pwd1 As String, pwd2 As String pwd1 = InputBox("Please Enter the password") If pwd1 = "" Then Exit Sub pwd2 = InputBox("Please re-enter the password") If pwd2 = "" Then Exit Sub 'Проверьте, идентичны ли оба паролиIf InStr(1, pwd2, pwd1, 0) = 0 Or _ InStr(1, pwd1, pwd2, 0) = 0 Then MsgBox "You entered different passwords. No action taken" Exit Sub End If For Each ws In Worksheets ws.Protect Password:=pwd1 Next MsgBox "All sheets Protected." Exit Sub End Sub Инструкции:
  1. Откройте рабочую книгу Excel
  2. Нажмите Alt + F11, чтобы открыть редактор VBA.
  3. Вставьте модуль для меню вставки
  4. Создайте приведенный выше код и вставьте в окно кода
  5. Сохраните файл в виде макросъемки
  6. Нажмите F5, чтобы выполнить его

Снять защиту всех рабочех листов в книге с помощью VBA

  Мы можем Снять защиту всех рабочех листов в книге с помощью VBA. Если вы хотите удалить ограничения всех листов, мы можем снять защиту всех листов за раз

Снять защиту всех рабочех листов в книге с помощью VBA-решения:

Мы можем использовать метод Unprotect и перебирать все рабочие листы в рабочей книге.

Снять защиту всех рабочех листов в книге с помощью VBA - Пример:

  Ниже приведен пример кода, который покажет вам, как Снять защиту всех рабочех листов в книге с помощью VBA.

Код Sub sbUnProtectAll() On Error GoTo ErrorOccured Dim pwd1 As String pwd1 = InputBox("Please Enter the password") If pwd1 = "" Then Exit Sub For Each ws In Worksheets ws.Unprotect Password:=pwd1 Next MsgBox "All sheets UnProtected." Exit Sub ErrorOccured: MsgBox "Sheets could not be UnProtected - Password Incorrect" Exit Sub End Sub Инструкции:
  1. Откройте рабочую книгу Excel
  2. Нажмите Alt + F11, чтобы открыть редактор VBA.
  3. Вставьте модуль для меню вставки
  4. Создайте приведенный выше код и вставьте в окно кода
  5. Сохраните файл в виде макросъемки
  6. Нажмите F5, чтобы выполнить его

Диалоговое окно «Открыть рабочий лист» в Excel VBA

  Диалоговое окно «Открыть диалог рабочего стола» позволяет пользователю ввести пароль для защиты рабочих листов. Так что у пользователя может быть возможность ввести требуемый пароль.

Диалоговое окно «Открыть диалог рабочего стола» - решение:

  Мы можем использовать Application.Dialogs (xlDialogProtectDocument) .Показать метод для отображения диалогового окна «Открыть рабочий стол».

Диалоговое окно «Открыть рабочую панель» - пример:

  Ниже приведен пример, чтобы показать вам, как это сделать.

Код Sub sbShowProtectDialogBox() 'Этот код выполнит требуемую задачу ...Application.Dialogs(xlDialogProtectDocument).Show End Sub Инструкции:

  Для выполнения кода следуйте приведенным ниже инструкциям.

  1. Откройте рабочую книгу Excel
  2. Нажмите Alt + F11, чтобы открыть редактор VBA.
  3. Вставьте модуль для меню вставки
  4. Создайте приведенный выше код и вставьте в окно кода
  5. Сохраните файл в виде макросъемки
  6. Нажмите F5, чтобы выполнить его

vh10295.rdkd.ru

vba - Как правильно активировать лист в рабочей книге

Я пытаюсь получить последний столбец и последнюю строку для данного рабочего листа в моей книге. Ниже приведен код, который я использую для получения этих значений. Этот код работает отлично (так как я получаю правильное количество столбцов и строк), пока я нажимаю на листе, а затем запускаю Sub LastRowCol().

Function LastUsedRow_Find() As Integer Dim rng As Range Set rng = ActiveSheet.Cells LastUsedRow_Find = rng.Find(What:="*", After:=rng.Cells(1), Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row End Function Function LastUsedColumn_Find() As Integer Dim rng As Range Set rng = ActiveSheet.Cells LastUsedColumn_Find = rng.Find(What:="*", After:=rng.Cells(1), Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False).Column End Function Sub LastRowCol() MsgBox "last row -> " & LastUsedRow_Find() MsgBox "last col -> " & LastUsedColumn_Find() End Sub

Но скажем, у меня, например, несколько листов. Я пытаюсь передать индекс листа методам, как показано ниже. Затем я пытаюсь активировать лист для данного индекса, так как я использую ActiveSheet несколько строк позже. Код работает без исключений. Но я не получаю правильное количество столбцов и строк в поле msg.

Function LastUsedRow_Find(wksIndex As Integer) As Integer ActiveWorkbook.Sheets(wksIndex).Activate Dim rng As Range Set rng = ActiveSheet.Cells LastUsedRow_Find = rng.Find(What:="*", After:=rng.Cells(1), Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row End Function Function LastUsedColumn_Find(wksIndex As Integer) As Integer ActiveWorkbook.Sheets(wksIndex).Activate Dim rng As Range Set rng = ActiveSheet.Cells LastUsedColumn_Find = rng.Find(What:="*", After:=rng.Cells(1), Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False).Column End Function Sub LastRowCol() MsgBox "last row -> " & LastUsedRow_Find(1) MsgBox "last col -> " & LastUsedColumn_Find(1) End Sub

Может кто-нибудь, пожалуйста, сообщите мне, что я могу делать неправильно или что мне может понадобиться изменить? Благодаря

qaru.site

vba - Активировать рабочий лист с помощью excel VBA

У меня есть файл "Workbook A" в папке. Обновленная версия отправляется мне каждые две недели. Я хочу открыть эту книгу из другой книги "Workbook B" и в то же время удалить пустые строки в "Workbook A".

Операции открытия и удаления будут выполняться с помощью макроса.

Это мой код до сих пор.

Sub RemoveEmptyRows() ' this macro will remove all rows that contain no data ' ive named 2 variables of data type string Dim file_name As String Dim sheet_name As String file_name = "C:\Users\Desktop\Workstation_A\Workbook_A.xlsm" 'Change to whatever file i want sheet_name = "Worksheet_A" 'Change to whatever sheet i want ' variables "i" and "LastRow" are needed for the for loop Dim i As Long Dim LastRow As Long ' we set wb as a new work book since we have to open it Dim wb As New Workbook ' To open and activate workbook ' it opens and activates the workbook_A and activates the worksheet_A Set wb = Application.Workbooks.Open(file_name) wb.Sheets(sheet_name).Activate ' (xlCellTypeLastCell).Row is used to find the last cell of the last row ' i have also turned off screen updating LastRow = wb.ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row Application.ScreenUpdating = False ' here i am using a step ' the step is negative ' therefore i start from the last row and go to the 1st in steps of 1 For i = LastRow To 1 Step -1 ' Count A - Counts the number of cells that are not empty and the ' values within the list of arguments (wb..ActiveSheet.Rows(i)) ' Afterwards deleting the rows that are totally blank If WorksheetFunction.CountA(wb.ActiveSheet.Rows(i)) = 0 Then wb.ActiveSheet.Rows(i).EntireRow.Delete End If Next i ' used to update screen Application.ScreenUpdating = True End Sub

Название рабочего листа содержит Worksheet_A как часть его имени, за которым следует дата. Например Worksheet_A 11-2-15.

В моем коде я назначил переменную sheet_name на Worksheet_A

sheet_name = "Worksheet_A"

и далее вниз я использовал

.Sheets(sheet_name).Activate

чтобы активировать рабочий лист. Я чувствую, что есть проблема с нижней строкой:

sheet_name = "Worksheet_A"

поскольку sheet_name не является точно Worksheet_A, он содержит только Worksheet_A как часть его имени.

Это вызывает проблему. Рабочая книга A открывается, но удаление пустых строк не происходит. Далее появляется сообщение об ошибке.

Ошибка времени выполнения 9: индекс вне диапазона.

Как мне изменить свой код, чтобы рабочий лист активировался и выполнялись макрооперации?

qaru.site

Не удается активировать рабочий лист VBA MS Excel онлайн

Вы можете. .Select один или несколько объектов (рабочие листы, ячейки и т. Д.) В коллекцию, но вы можете только. .Activate один из них. Все, что активировано, всегда является частью выбора, даже если это один и тот же единственный объект. Вам не нужно и то и другое. Выбирайте и .Activate объект, если вы не выбираете более одного и требуете, чтобы один из них был ActiveCell или ActiveSheet.

По сути, для того, чтобы привлечь внимание пользователя к листу или объекту диапазона, необходимо использовать метод .Select или .Activate . Нет необходимости выбирать или активировать что-то, чтобы работать с ним (передача данных говорит об этом).

Ниже приведена краткая переработка вашей подпрограммы, которая отходит от использования. Выберите и .Activate для ссылки на объекты.

Sub summarizeRankings() Dim lstA As Long, lstD As Long, clrYellow As Long, x As Long, ws As Worksheet With ThisWorkbook With .Worksheets("Rankings") If .AutoFilterMode Then .AutoFilterMode = False With .Cells(1, 1).CurrentRegion With .Resize(.Rows.Count, 8) .Cells.Sort Key1:=.Columns(8), Order1:=xlAscending, _ Orientation:=xlTopToBottom, Header:=xlYes .AutoFilter End With End With Set ws = .Cells(1, 1).Parent End With With .Worksheets("Summary") .Range("A8:A18").Value = ws.Range("A2:A12").Value .Range("B8:B18").Value = ws.Range("E2:E12").Value .Range("C8:C18").Value = ws.Range("G2:G12").Value .Range("D8:D18").Value = ws.Range("h3:h22").Value lstA = .Cells(Rows.Count, "A").End(xlUp).Row lstD = .Cells(Rows.Count, "D").End(xlUp).Row clrYellow = RGB(256, 256, 0) For x = lstD To 8 Step -1 If (.Cells(x, "D").Value) >= 6 Then .Cells(x, "A").EntireRow.Delete ElseIf (.Cells(x, 4).Value) < 6 Then .Cells(x, 1).Interior.Color = clrYellow .Cells(x, 1).Font.Bold = True .Cells(x, 4).Interior.Color = clrYellow .Cells(x, 4).Font.Bold = True End If Next x .Activate '<-last step brings the Summary worksheet to the front End With End With Application.Calculate End Sub

См. Как избежать использования Select в Excel VBA макросов для получения дополнительных методов, чтобы избежать использования выбора и активации для достижения ваших целей.

excel.bilee.com