Столкнулся с такой проблемой: Создал надстройку. Внутри нее лежит расчетная таблица (она скрыта от пользователей). Расчетная таблица - стандартная таблица (не умная). Эта таблица создается пользователем через нажатие на кнопку (на панели инструментов) - то есть, стандартное копирование листа из надстройки в запущенный пользователем Excel. В этой таблице есть большое количество выпадающих списков (списки созданы через "Проверку данных" - "Списки") в различных ячейках. И только единственный список сделан через ссылку на "диспетчер имен", так как он связан с другим списком. Так вот, этот список в ячейке, при копировании листа из надстройки в запущенный Excel, просто исчезает и все, ячейка в таблице становится "Любое значение". При этом, в таблице, которая в надстройке (IsAddin = false), все работает, список есть. В созданной пользователем таблице можно руками прописать в Списках ссылку на Диспетчер имен и все работает. При ручном копировании таблицы из надстройки в Excel аналогично - исчезает список. То есть, вся проблема в копировании листа именно из надстройки. Я подумал, хрен с ним, и пробовал прописать макрос, который вставляет в данную ячейку список с ссылкой на имя из диспетчера имен. Но, макрос не срабатывает, на строке .Add выдает ошибку - Run-Time 1004 Application-defined or object-defined error (код ниже). Код получил через запись макроса. Такое решение проблемы меня бы устроила, но не могу понять почему не работает макрос.
Код
Private Sub am()
Range("F10:L10").Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=Горда_К"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End Sub
Буквально на прошлой неделе все работало и проблем не было. Эта же надстройка на рабочем компе работает и список не исчезает. На домашнем компе список исчезает. Домашний комп: Операционная система Windows 10, Office 2016. Рабочий комп: Операционная система Windows 10, Office 2016.
По ссылке находится надстройка. На примере "Квартира" - создается таблица и в ней в диапазоне ячеек F10:L10 (он завязан на списках F9:L9 через диспетчер имен) должен быть выпадающий список. У меня они исчезает при создании копии листа. Если сделать IsAddin = false и посмотреть этот диапазон на листе с именем "К_01|01|2019_ПО_АРФа", то списки там есть.
Не понимаю с чем связано такое явление. Читал в инете, похожей проблемы не нашел. Ctrl + 6 - это не то! Прошу помощи.
Пытаюсь получить имя листа, на ячейку которого у меня идет ссылка. Пример во вложении. Сделал ссылку в ячейке А1 Листа1 на ячейку А1 Листа2. Прописал формулу (нашел в интернете):
Что я делаю не так? Есть какие-то еще способы получить имя листа, на ячейку которого идет ссылка (в той же книге)? К сожалению макрос не подойдет, лучше формулу.
Буквально 3 недели назад программка работала как часы и проблем не было. На листе "Данные" пользователь задает адреса объектов недвижимости, жмет кнопку и появляется карта, на которой отмечены все объекты метками: объект оценки - красная метка на карте, объекты-аналоги - синие метки с номерами на карте. Так программа проработала более 2-х лет. Недели 3 назад программа стала работать нестабильно: все метки стали вешаться на один адрес (см. файл). Начал разбираться с самим кодом и заметил, что на строке кода:
в ячейку А1 листа temp вместо нормального адреса записываются "иероглифы". Из-за этого все координаты становятся одинаковыми для всех объектов недвижимости из перечня заданных. [img]file:///C:/Users/skapr/OneDrive/РабоÑий%2520ÑÑол/ÑиÑ1.jpg[/img] Не могу понять с чем это связано. Правильно ли я выявил ошибку? Как можно устранить эту ошибку? На что обратить внимание?
Столкнулся с такой задачей (сразу отмечаю, что объединения ячеек НЕТ!):
Стандартная высота строки в Excel = 15. Мне нужно меньше! Я для себя выставил высоту строки 12.75 и сделал перенос текста. Когда я ввожу туда текст, который превышает размеры ячейки, то перенос текста срабатывает, а строка остается постоянной (не расширяется, = 12.75). Тогда я сделал автоподбор высоты строки через двойной клик по границе - автоподбор срабатывает и все норм. Если затем удалить текст, то высота строки возвращается к размеру = 15, хотя в начале я выставил 12.75.
Удивительно то, что в этой же книге на другом листе все работает хорошо даже при размере 12.75. Смериться с размером в 15 не хочу, так как это нарушит мне всю однотипность + хочу понять в чем проблема.
Что я делаю не так? Может для листа где-то можно выставить настройки?
Создаю свою надстройку в Excel. В рамках этой надстройки есть панель инструментов с кнопочками. Одна из кнопочек отвечает за создание (по клику) специальной расчетной таблицы (ее эталон находится в Надстройка.xlam). При нажатии на кнопочку появляется эта табличка (стандартное копирование листа). В этой табличке есть области, которые защищены (защита листа), при этом, защита листа ставится при создании этой таблицы и я добавил код UserInterfaceOnly:=True чтобы защита не мешала макросам вносить изменения в защищенные области таблицы. Все работает на ура!
НО! Если пользователь создал табличку, поработал в ней, сохранил файл и закрыл его, а затем снова открыл (решил что-то изменить), то защита листа начинает мешать работе макроса, то есть, вылетает ошибка!
Как можно решить данную задачу? Может есть какие-то идеи? Может можно как-то отдельно запускать (обновлять) UserInterfaceOnly:=True?? Я пробовал сделать так:
Код
Private Sub Workbook_Open()
On Error Resume Next
Set App = Application
If ActiveWorkbook.ActiveSheet.Range("A1").Value = "К_01|01|2019_ПО_АРФа" Then
ActiveWorkbook.ActiveSheet.Protect Password:=(Workbooks("Надстройка.xlam").Sheets("Управление").Range("B1")), DrawingObjects:=False, Contents:=True, Scenarios:=True, UserInterfaceOnly:=True
ActiveWorkbook.ActiveSheet.EnableSelection = xlUnlockedCells
End If
End Sub
Код
Private Sub App_SheetActivate(ByVal Sh As Object)
If ActiveWorkbook.ActiveSheet.Range("A1").Value = "К_01|01|2019_ПО_АРФа" Then
ActiveWorkbook.ActiveSheet.Protect Password:=(Workbooks("Надстройка.xlam").Sheets("Управление").Range("B1")), DrawingObjects:=False, Contents:=True, Scenarios:=True, UserInterfaceOnly:=True
ActiveWorkbook.ActiveSheet.EnableSelection = xlUnlockedCells
End If
End Sub
Я планировал при запуске книги проверять, если активный лист является расчетной таблицей (.Range("A1").Value = "К_01|01|2019_ПО_АРФа"), то ставить защиту (я бы сказал это своего рода обновление защиты, чтобы заработал UserInterfaceOnly:=True). Соответственно и при переходе на др листы также проверяется это условие и заново ставится защита.
В моем подходе НЕ работает код (выдает ошибку):
Код
If ActiveWorkbook.ActiveSheet.Range("A1").Value = "К_01|01|2019_ПО_АРФа" Then
ActiveWorkbook.ActiveSheet.Protect Password:=(Workbooks("Надстройка.xlam").Sheets("Управление").Range("B1")), DrawingObjects:=False, Contents:=True, Scenarios:=True, UserInterfaceOnly:=True
ActiveWorkbook.ActiveSheet.EnableSelection = xlUnlockedCells
End If
Методом тыка попробовал и так (не помогло):
Код
Private Sub App_Open()
If ActiveWorkbook.ActiveSheet.Range("A1").Value = "К_01|01|2019_ПО_АРФа" Then
ActiveWorkbook.ActiveSheet.Protect Password:=(Workbooks("Надстройка.xlam").Sheets("Управление").Range("B1")), DrawingObjects:=False, Contents:=True, Scenarios:=True, UserInterfaceOnly:=True
ActiveWorkbook.ActiveSheet.EnableSelection = xlUnlockedCells
End If
End Sub
При переходе на др лист все работает. Возможно ли через Workbook_Open() в данном случае поставить защиту листа? Или как можно при запуске книги "перезащитить" лист с UserInterfaceOnly:=True?
Ранее у меня был расчетный файл с макросами (.xlsm). Расчетный файл представлял собой таблицу для ввода данных, которая управлялась отчасти макросами. Один из макросов был двойной клик по некоторым ячейкам таблицы, который вызывал форму автопоиска. Реализовал я его через "Workbook_SheetBeforeDoubleClick".
На текущий момент я этот расчетный файл перенес в надстройку (.xlam). Теперь у меня есть панель инструментов с кнопочками. При нажатии на кнопочку "Создание таблицы" расчетная таблица появляется в текущей книги стандартным копированием листа из файла надстройки в текущую книгу. Табличка переносится и все хорошо. Не понятно, как реализовать двойной клик на ряд ячеек. Табличка появляется в стандартной книге Excel (.xlsx) и никаких макросов там не будет. Есть идея как-то вызывать макрос из модулей надстройки при двойном клике, но как это сделать и реально ли это, не понятно!
Скажите пожалуйста, насколько реально реализовать такую задачку?
Всем доброго времени суток! Прошу помощи в актуализации кода. Хочу получить все имена листов закрытой книги. Взял вот такой код (от ZVI):
Код
Sub ZVI_GetExternalTables()
' Reference to Microsoft ActiveX Data Objects 2.8 Library
Dim FileName$, s$, i&, rs&, x, Arr
' Choose an external file
With Application.FileDialog(msoFileDialogFilePicker)
.Filters.Add "Excel", "*.xls;*.xlsx", 1
.InitialFileName = ThisWorkbook.Path
.AllowMultiSelect = False
If .Show = False Then Exit Sub
FileName = .SelectedItems(1)
End With
' Collect all table names of the external file
With New ADODB.Connection
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & FileName & ";Extended Properties=Excel 8.0;"
.CursorLocation = adUseClient
.Open
With .OpenSchema(adSchemaTables)
rs = .RecordCount
ReDim Arr(1 To rs, 1 To 2)
For i = 1 To rs
Arr(i, 1) = i: Arr(i, 2) = Replace(.Fields("TABLE_NAME").Value, "$", "")
.MoveNext
Next
.Close
End With
.Close
End With
' Show list of tables
With Range("A1:B1")
.CurrentRegion.Resize(, 2).ClearContents
.Value = Array("Tables", FileName)
.Resize(rs - 1).Offset(1).Value = Arr
End With
End Sub
Проблема в том, что на строке .Open выдает ошибку: Run-time error 3706 Не удается найти указанный поставщик. Вероятно он установлен не правильно.
Написал код по перемещению вкладки с формы (надо нажать на "Кнопка" на вкладке Лист 1). Дело в том, что структура книги будет на защите.
Код
Private Sub CommandButton6_Click()
UserForm1.Show
End Sub
Private Sub CommandButton1_Click()
ActiveWorkbook.Unprotect Password:="12345"
k = ActiveSheet.Index
If k = 1 Then
Exit Sub
ElseIf k = 2 Then
ActiveSheet.Move Before:=Sheets(1)
Else
ActiveSheet.Move After:=Sheets(k - 2)
End If
ActiveWorkbook.Protect Password:="12345", Structure:=True, Windows:=False
End Sub
Private Sub CommandButton2_Click()
ActiveWorkbook.Unprotect Password:="12345"
k = ActiveSheet.Index
If Sheets.Count = k Then
Exit Sub
Else
ActiveSheet.Move After:=Sheets(k + 1)
End If
ActiveWorkbook.Protect Password:="12345", Structure:=True, Windows:=False
End Sub
Проблема в том, что очень медленно это все работает из-за защиты, так как сначала ее снимаем, а затем ставим опять. Можно ли как-то решить этот вопрос?
У меня есть таблица, в которой во время печати скрываются столбцы. При нажатии на кнопку "Печать" скрываются столбцы (по условию), затем находим последний столбец и строку выделяется дипазон печати - печатаем и возвращаем все на место (показываем скрытые столбцы). Код ниже:
Код
Private Sub CommandButton6_Click()
Dim ILastRow, ILastCol As Long
On Error GoTo ErrorPrinter
Application.ScreenUpdating = False
If ActiveWorkbook.Sheets("Лист1").Range("G2").Value = 0 Then Columns("G:G").Hidden = True
If ActiveWorkbook.Sheets("Лист1").Range("H2").Value = 0 Then Columns("H:H").Hidden = True
If ActiveWorkbook.Sheets("Лист1").Range("I2").Value = 0 Then Columns("I:I").Hidden = True
If ActiveWorkbook.Sheets("Лист1").Range("J2").Value = 0 Then Columns("J:J").Hidden = True
If ActiveWorkbook.Sheets("Лист1").Range("K2").Value = 0 Then Columns("K:K").Hidden = True
If ActiveWorkbook.Sheets("Лист1").Range("L2").Value = 0 Then Columns("L:L").Hidden = True
ILastCol = ActiveWorkbook.Sheets("Лист1").Cells(4, Columns.Count).End(xlToLeft).Column
ILastRow = ActiveWorkbook.Sheets("Лист1").Cells(Rows.Count, 4).End(xlUp).Row
ActiveWorkbook.Sheets("Лист1").Range(Cells(4, 4), Cells(ILastRow, ILastCol)).Select
Selection.PrintOut Copies:=1, Collate:=True
If ActiveWorkbook.Sheets("Лист1").Range("G2").Value = 0 Then Columns("G:G").Hidden = False
If ActiveWorkbook.Sheets("Лист1").Range("H2").Value = 0 Then Columns("H:H").Hidden = False
If ActiveWorkbook.Sheets("Лист1").Range("I2").Value = 0 Then Columns("I:I").Hidden = False
If ActiveWorkbook.Sheets("Лист1").Range("J2").Value = 0 Then Columns("J:J").Hidden = False
If ActiveWorkbook.Sheets("Лист1").Range("K2").Value = 0 Then Columns("K:K").Hidden = False
If ActiveWorkbook.Sheets("Лист1").Range("L2").Value = 0 Then Columns("L:L").Hidden = False
Application.ScreenUpdating = True
Exit Sub
ErrorPrinter:
On Error Resume Next
MsgBox "Устройство не найдено! Обратитесь к администратору!", vbOKOnly + vbExclamation, "Предупреждение"
Resume Next
End Sub
Я подумал, что надо подстраховаться, вдруг принтер выдаст ошибку или принтера не будет. У меня дома нет принтера, поэтому решил попробовать этот код дома, а он не ловит ошибку. На строке:
Код
Selection.PrintOut Copies:=1, Collate:=True
он пытается распечатать и выдает ошибку: "Printer not activate, error code -40".
Задача такая: если форма открыта (запущена), тогда код внутри события Workbook_SheetActivate не должен выполняться (я обыгрываю этот момент через оператор IF), в ином случае (если форма запущена) код внутри события выполняется.
Почитал на данном форуме похожую тему и там предлагается:
Код
IF UserForm.Visible Then ...
Такой вариант не совсем подошел, так как в данном условии запускается UserForm_Initialize и все усложняется (лишние действия). Начинает проигрываться код, который не надо проигрывать. Нашел еще такой вариант:
Код
CurrentProject.AllForms(UserForm).IsLoaded
Но, он тоже запускается UserForm_Initialize. Нашел вот такой кусок кода:
Код
Public Function IsFormLoaded(ByVal sFormName As String) As Boolean
Dim i_l As Integer
For i_l = cNull To Forms.Count - vbNull
If sFormName = Forms(i_l).Name Then IsFormLoaded = True: Exit Function
Next
End Function
Но, тут не понятно, что такое cNull? На строчке For i_l = cNull To Forms.Count - vbNull выдает ошибку, так как cNull не определяется. Пытался данный код преобразовать во в такой:
Код
Public Function IsFormLoaded(ByVal sFormName As String) As Boolean
Dim Frm As UserForm
For Each Frm In CurrentProject.AllForms
If sFormName = CurrentProject.AllForms.Name Then IsFormLoaded = True: Exit Function
Next
End Function
Тут возникает ошибка на строке For Each Frm In CurrentProject.AllForms. Наверняка переменная объявлена не совсем правильно, Переменная Frm не определяется.
Пытаюсь вводить данные (в процентах) в ячейку C4 через TextBox (с формы). При этом, делаю ограничение на ввод ненужных символов. Есть вот такой код:
Код
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Z = UserForm1.TextBox1.Value
ActiveWorkbook.Sheets("Лист1").Range("C4").Value = Z & "%"
If IsNumeric(ChrW(KeyAscii)) Then
ElseIf KeyAscii = 46 Or KeyAscii = 44 Then
KeyAscii = 44
If InStr(Z, Chr(KeyAscii)) > 1 Then KeyAscii = 0 'запрет повторения разделителя
If Len(Z) = 0 Then KeyAscii = 0 'запрет лидирующего разделителя
Else
KeyAscii = 0
End If
End Sub
Код работает отлично! НО! Проблема вот в чем: когда, например, я ввожу "123", то в ячейке С4 отражается только "12", то есть "3" не отображается, чтобы отразить "3" необходимо ввести следующий символ, который пользователь вводить и не планирует. Прошу помощи. Как сделать так, чтобы в ячейке С4 сразу выводились все значения? Файл во вложении.
Всем тоброго времени суток! Прошу помощи в одном вопросе. Столкнулся с такой проблемой: есть Checkbox8 и при клике на него производится проверка:
Код
Private Sub CheckBox8_Click()
If ActiveWorkbook.Sheets("ЗУ").Range("F119").Value = 0 Then
MsgBox "Данная корректировка в данном случае не применима!", vbOKOnly, "Предупреждение"
ПО_АРФа.Frame3.CheckBox8.Value = False
Exit Sub
ElseIf ActiveWorkbook.Sheets("ЗУ").Range("F119").Value = 1 And _
ActiveWorkbook.Sheets("ЗУ").Range("G119").Value + _
ActiveWorkbook.Sheets("ЗУ").Range("H119").Value + _
ActiveWorkbook.Sheets("ЗУ").Range("I119").Value + _
ActiveWorkbook.Sheets("ЗУ").Range("J119").Value + _
ActiveWorkbook.Sheets("ЗУ").Range("K119").Value + _
ActiveWorkbook.Sheets("ЗУ").Range("L119").Value < 6 Then
MsgBox "Данная корректировка в данном случае не применима!", vbOKOnly, "Предупреждение"
ПО_АРФа.Frame3.CheckBox8.Value = False
Exit Sub
Else
Application.ScreenUpdating = False
If ПО_АРФа.Frame3.CheckBox8.Value = False Then
ПО_АРФа.Frame3.CheckBox8.Caption = "off"
ActiveWorkbook.Sheets("ЗУ").Range("B44").Value = 0
ActiveWorkbook.Sheets("ЗУ").Rows("45").Hidden = True
ActiveWorkbook.Sheets("ЗУ").Rows("47").Hidden = True
Else
ПО_АРФа.Frame3.CheckBox8.Caption = "on"
ActiveWorkbook.Sheets("ЗУ").Range("B44").Value = 1
ActiveWorkbook.Sheets("ЗУ").Rows("45").Hidden = False
ActiveWorkbook.Sheets("ЗУ").Rows("47").Hidden = False
End If
Application.ScreenUpdating = True
End If
End Sub
если условие ActiveWorkbook.Sheets("ЗУ").Range("F119").Value = 0 выполняется, то выходит сообщение о невозможности применения корректировки и галочка должна "слететь", поэтому я и прописал код ПО_АРФа.Frame3.CheckBox8.Value = False, НО, при выполнении кода ПО_АРФа.Frame3.CheckBox8.Value = False программа начиаент заново выполнять все действия, опять проверяет условие, вылетает сообщение и затем галочка "слетает". Но так бы не хотельсо. Подскажите пожалуйста, как можно решить эту проблему с повтором кода? Может есть какой-то иной вариант реализации такой задачи?
Всем доброго времени суток! Не могу разобраться как склеить имя столбца с именем строки, например, есть диапазон А1:А100, но, у меня, например, заполненно только первые 30 (А1:А30) ячеек диапазона, а остальные пустые, соответственно мне надо чтобы диапазон был динамическим (строка изменялась).
Прописываю следующую формулу:
Код
=ИНДЕКС(ЛИНЕЙН(А1:А100;В1:В100);1)
так как заполненны только первые 30 ячеек обоих диапазонов, то ЛИНЕЙН не срабатывает, соответственно пытался сделать так:
Всем доброго времени суток! У меня Excel 2010! Столкнулся с проблемой обновления ссылок на удаленные документы Excel: Когда я ссылаюсь на ячейку в книге, которая лежит на моем компе: ='C:\Работа\Статистика\[12.xlsx]Лист1'!B3, все работает и обновляется отлично!! При запуске Excel спрашивает "Обновить" или "Не обновлять", жму "Обновить" и все супер. Когда я ссылаюсь на ячейку удаленной книги (лежит в сети): ='http://work/sites/otdel/Doc/Архив/[Статистика 2016.xls]Лист2'!A6, то с обновлением ссылок не так все просто. Предложение Excel "Обновить" уже не помогает (при этом файл, на ячейку которого ссылаемся ЗАКРЫТ). Обновление произойдет только в том случае, если сетевой файл Excel ОТКРЫТ (например, открыл удаленный файл, в нашем ссылки обновились, затем закрыл удаленный файл). Планирую ссылаться на 3 удаленных файла, поэтому постоянно их открывать и закрывать ради обновления - это не вариант)))
При закрытом удаленном файле, в случае обновления ссылок через "Изменение связей", состояние показывает: Ошибка: источник не найден.
Как можно обновлять такие ссылки простым способом? Можно ли вообще?
Думаю как решить вот такую задачу: У меня есть количество респондентов, например 16 человек, они делятся на мужчин и женщин. Также у меня есть их возраст. Таблица выглядит так:
Мужской
Женский
Возраст респондента
1
25
1
28
1
33
1
18
1
45
1
58
1
86
1
37
1
41
1
53
1
66
1
69
1
88
1
20
1
25
1
30
Я хочу произвести расчет персентелей по возрасту отдельно для мужчин и отдельно для женщин. Я прикинул, что это должно выглядеть как-то так: используем цикл с условием для того, чтобы перебрать ячейки и выделить, например, Мужчин, запоминаем этот массив и затем рассчитываем значение персентеля и присваиваем полученное значение необходимой ячейке Cells(i, 65) = Application.Percentile(Array(), 0.1).
Мне не понятно как правильно поместить необходимые значения в массив. Для мужчин должен сформироваться массив: 28, 33, 18, 45, 86, 53, 66, 88, 20, для женщин: 25, 58, 37, 41, 69, 25, 30.
Доброго времени суток! Прошу помощи у профессионалов.
Что я пытаюсь сделать: Есть маленькая таблица (пример см. во вложении), в которую стекается информация из других файлов. Важны только 2 столбца - "Наименование" и "Количество, з/с". Мне необходимо автоматически строить круговую диаграмму только тех строк, в которых количество з/с больше нуля, в примере это "1-го уровня", "2-го уровня", "3-го уровня" и Прочее. Строки "4-го уровня", "5-го уровня" и "ВМП" в диаграмму попасть не должны. Нули могут быть в разных наименованиях, поэтому программный код должен находить значения больше нуля.
Нашел в инете и сделал под себя следующий код:
Код
Sub Graph2()
Dim iCell As Range
Dim iUnionRange As Range
For Each iCell In Workbooks(NameK).Sheets(NameV).Range("P4:P8, P10:P11")
If iCell > 0 Then
If iUnionRange Is Nothing Then
Set iUnionRange = Union(iCell, iCell)
Else
Set iUnionRange = Union(iUnionRange, iCell)
End If
End If
Next
If Not iUnionRange Is Nothing Then iUnionRange.Select
End Sub
Этот код выделяет только значения (числа), которые больше нуля, а мне необходимо, чтобы он выделял и наименования. Не могу до думаться, что необходимо добавить в код, чтобы он выделял еще и ячейки слева от ненулевых значений. На столбцы с долями не обращайте внимание. Помогите пожалуйста
Всем доброго времени суток!! Проблема: У меня большой программный код (Excel ругается - Procedure too large), поэтому я решил определенные части кода вынести в подпрограммы. Но, не понимаю как правильно сделать ссылки на переменные, которым я присвоил: имя книги, имя листа, количество столбцов таблицы, количество строк таблицы и т.д. Все эти переменные участвуют на протяжении всего кода! Суть: У меня кнопка, при нажатии которой обрабатываются данные таблицы из другой Книги. Поэтому, прежде чем обрабатывать таблицу, я создаю вкладку, имя которой я присваиваю переменной NameV, определяю количество строк и столбцов в таблице и присваиваю эти величины переменным ILasRow и ILastCol и т.д. Затем с этими переменными я работаю. На входе таблицы разных объемов, поэтому я определяю ее размеры. Код получился слишком большой и я стал переносить блоки в подпрограммы и встретился с такой проблемой, что в подпрограмме мои переменные NameV, ILasRow, ILastCol теряют то, что им было присвоено, становятся пустыми. Поэтому перенести код, содержащий перечисленные мной переменные, не реально в подпрограмму. Получается, что в целом весь код работает, а если часть перенести в подпрограмму, то полетят ошибки, так как мои переменные - Empty. Вопрос: Как в данном случае сделать перенос части кода в подпрограмму, чтобы мои переменные не теряли своего содержания?? Что для этого необходимо посмотреть/почитать?
Все доброго времени суток!! Вчера весь день бился, не на жизнь, а на смерть, с COUNTIF, но что-то не получается реализовать задуманное)) В инете ничего по этому вопросу не нашел(( Суть: В моей программе есть вот такой кусочек кода: 1. Sheets(NameV).Range("H4").Select 2. ActiveCell.FormulaR1C1 = "=COUNTIF(R4C9:R282C9,RC[1])" 3. Workbooks("АМ по операциям.xlsm").Sheets(NameV).Range("H4").Select 4. Selection.AutoFill Destination:=Workbooks("АМ по операциям.xlsm").Sheets(NameV).Range(Sheets(NameV).Cells(4, lLastCol - 10), Sheets(NameV).Cells(lLastRow - 2, lLastCol - 10)), Type:=xlFillDefault
Что я делаю: У меня есть таблица (количество столбцов в ней всегда 18 - const, а вот количество строк меняется, поэтому я подсчитываю количество строк в таблице и записываю значение в переменную lLastRow). Я выделяю ячейку H4 (NameV - это переменная, которая хранит в себе имя созданного листа) и пытаюсь в нее вставить "=СЧЁТЕСЛИ($I$4:$I$282;I4)", причем "диапазон" я закрепляю, а "критерий" нет!! Затем, я протягиваю ячейку H4 вниз, до H282, использую при этом программный код (строка №4). Для того, чтобы понять как записать СЧЁТЕСЛИ, я прогнал через запись макроса и получил соответствующий код (строка №2). В таком виде код работает и никаких проблем!! Чего хочу добиться: Я пытаюсь понять как правильно в "=COUNTIF(R4C9:R282C9,RC[1])", в место 282 затолкать переменную lLastRow - 2, да так, чтобы это еще и работало))???
Для справки: В инете нашел пример вот такого кода: Cells(i, LastRow - 2).FormulaR1C1 = "=COUNTIF(RC[-" & LastRow - 5 & "]:RC[-1],""*""&""(""&""*""&"")""&""*"")" Пытался сделать по аналогии, но почему-то не работает((
Все доброго времени суток! Суть задачи: я выгружаю из информационной системы табличку с данными. Она выгружается в Excel (название документа "reply_90.xls"). Мне необходимо копировать эту табличку в свою книгу Excel (название "АМ по операциям"). Использую код я открываю "reply_90", определяю размер таблицы (мне так надо) и пытаюсь ее копировать в свою книгу "АМ по операциям.xls", но выскакивает ошибка: Run-time error '1004': Application-defined or object-defined error. Пытался записать макрос, но полученный код тоже вызывает эту ошибку.
IName - это автоматическое определение названия книги "reply_90.xls" (я так сделал), дело в том, что при выгрузке название, а точнее число у названия меняется от 0 до 1000, например, может быть "reply_10.xls", "reply_345.xls" и т.д. sName - это переменная, которая содержит в себе название вкладки в "reply_90.xls", в которой находится таблица, он совпадает с названием книги, но только без .xls. lLastRow - это определенное значение строки lLastCol - это определенное значение столбца
Я выделяю во вкладке "reply_90" книги "reply_90.xls" диапазон от А3 до R73, и пытаюсь его копировать и вставить во вкладку "Обработка" книги "АМ по операциям.xls" в ячейку Е3. Ошибка вылазит именно при выделении!!! то есть на строчке Workbooks(IName).Sheets(sName).Range(Cells(3, 1), Cells(lLastRow, lLastCol)).Select. Если сделать так: Workbooks(IName).Sheets(sName).Range(Cells(3, 1), Cells(lLastRow, lLastCol)).Copy - то не поможет, на этой строчке вылезет ошибка!
Выдает ошибку на строчке: Sheets(sName).Range(Cells(3, 1), Cells(lLastRow, lLastCol)).Copy Destination:=ThisWorkbook.Worksheets("Обработка").Range(RngAddress) Но мне необходимо, чтобы копировалось в ячейку Е3.
Использовал еще ряд перестановок различных, но ничего не получается ((( Помогите пожалуйста, не понимаю как решить эту проблему! Я в этих делах новичок!