Привет мастерам. Не могу понять в чем проблема при работе Worksheet_SelectionChange. Внутри построено условие со всплывающим сообщением (подтверждения выполнения), при нажатии "Да" все корректно работает, но при нажатии "Нет", то все просто перестает работает. Макрос "Worksheet_SelectionChange" больше не реагирует, пока не перезапустишь EXCEL
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
DateNameEvent Target, Range(Cells(3, 7), Cells(20, 7))
End Sub
Sub DateNameEvent(Target As Range, KeyCells As Range)
Application.EnableEvents = False
If Not Application.Intersect(KeyCells, Target) Is Nothing Then
If Cells(Target.Row, 7) <> "Выполнено" Then
If MsgBox(Подтвердить выполнение " & "(" & Cells(ActiveCell.Row, ActiveCell.Column - 3).Value & ")" & "?" & Chr(13) & _
"Исполнитель:" & Cells(ActiveCell.Row, ActiveCell.Column - 4).Value & ".", vbExclamation + vbYesNo, "Выполнение задания") = vbYes Then
ActiveCell.Value = "Выполнено"
ActiveCell.Interior.Color = 52224
Cells(Target.Row, 6).Interior.Color = RGB(255, 255, 255)
Cells(Target.Row, 24).Value = Application.UserName
Cells(Target.Row, 25).Value = Date
Cells(Target.Row, 26).Value = Time
Else
Exit Sub
End If
Else
If MsgBox("Задание " & "(" & Cells(ActiveCell.Row, ActiveCell.Column - 3).Value & ") уже выполнено, убрать отметку" & "?" & Chr(13) & _
"Исполнитель:" & Cells(ActiveCell.Row, ActiveCell.Column - 4).Value & ".", vbInformation + vbYesNo, "Выполнение задания") = vbYes Then
ActiveCell.Value = "Подтвердить выполнение"
ActiveCell.Interior.Color = 13497086
Cells(Target.Row, 27).Value = Application.UserName
Cells(Target.Row, 28).Value = Date
Cells(Target.Row, 29).Value = Time
If Cells(ActiveCell.Row, ActiveCell.Column - 1) < Date Then
Cells(Target.Row, 6).Interior.Color = 255
End If
Else
Exit Sub
End If
End If
End If
Application.EnableEvents = True
End Sub
Задача состояла в том, чтобы в 3 столбца и 7 строк забить цифры от 1 до 7 случайным образом, с условием, что: 1. В строке не было повторяющихся чисел 2. Чтобы в разных строках не было по 2х одинаковым чисел
По сути, это рандомная жеребьевка 7ми команд при игре в круг (каждый с каждым) в день играет по 3 команды
7
5
6
5
1
4
2
4
6
6
1
3
1
2
7
5
2
3
3
4
7
Сразу предупрежу, что реализация "топорная", но все же работает. После запуска таблица выстраивается, но после 3-го запуска (именно 3-го) уходит в зацикл. Подскажите в чем дело или что поправить
Код
Sub AxeRND()
Dim arr()
Range(Cells(1, 1), Cells(20, 3)).ClearContents
For i = 1 To 3
Return1:
rDig = Int(Rnd * 7 + 1)
Cells(1, i) = rDig
If Cells(1, 1) <> "" And Cells(1, 2) <> "" And Cells(1, 3) <> "" Then
If Cells(1, 1) = Cells(1, 2) Or Cells(1, 1) = Cells(1, 3) Or Cells(1, 2) = Cells(1, 3) Then
GoTo Return1
End If
End If
Next
For j = 2 To 7
'Randomize
Return2:
For i = 1 To 3
rDig = Int(Rnd * 7 + 1)
LR = Cells(Rows.Count, 1).End(xlUp).Row
Erase arr
arr = Range(Cells(1, 1), Cells(LR + 1, 3))
Cells(j, i) = rDig
If rDig = arr(j, 1) Or rDig = arr(j, 2) Or rDig = arr(j, 3) Then
GoTo Return2
End If
Next i
For x = 1 To j - 1
If ((Cells(j, 1) = arr(x, 1) Or Cells(j, 1) = arr(x, 2) Or Cells(j, 1) = arr(x, 3)) And (Cells(j, 2) = arr(x, 1) Or Cells(j, 2) = arr(x, 2) Or Cells(j, 2) = arr(x, 3))) Or _
((Cells(j, 1) = arr(x, 1) Or Cells(j, 1) = arr(x, 2) Or Cells(j, 1) = arr(x, 3)) And (Cells(j, 3) = arr(x, 1) Or Cells(j, 3) = arr(x, 2) Or Cells(j, 3) = arr(x, 3))) Or _
((Cells(j, 2) = arr(x, 1) Or Cells(j, 2) = arr(x, 2) Or Cells(j, 2) = arr(x, 3)) And (Cells(j, 3) = arr(x, 1) Or Cells(j, 3) = arr(x, 2) Or Cells(j, 3) = arr(x, 3))) Then
GoTo Return2
End If
Next
Next j
End Sub
Эксперты, сможет кто помочь? Необходимо с различной периодичностью доступ к файлу ограничить (на время убрать), Но не всегда удобно всех обзванивать или кто-то открыл файл и ушёл. Поэтому вывел кнопку с закрытием файла у всех, код ранее где-то находил и он точно работал. Но потом, то ли я что-то поменял... То ли лыжи не те...
В общем сейчас код такой, но он закрывает файл только у меня. Или есть другие пути решения вопроса?
Код
Private Sub CloseSaveAll()
Dim MyPath$, MyName$
MyPath = ThisWorkbook.Path
MyName = ThisWorkbook.Name
GetObject(MyPath & "\" & MyName).Close False
ThisWorkbook.Close True
End Sub
Добавил новый модуль в существующий файл, после некорректного закрытия выходит сообщение "Invalid Data format". То же самое сообщение при попытке открыть Модуль, пересохранить файл, импортировать модуль и прочее.
Если ли возможность восстановить написанное в данном модуле?
Добрый день, форумчане! Столкнулся с такой проблемой: Создана надстройка XLAM, при запуске и установке ее с локального компьютера, отлично работает. Но если я её помещаю на общий диск, чтобы все сотрудники могли пользоваться (ну а также, чтобы можно было менять параметры и код надстройки для всех одновременно), то при добавлении ее, вылазит ошибка "Невозможно скопировать надстройку в библиотеку" Добавляют надстройку > Файл > Параметры > Надстройки > Перейти > Обзор > Выбираю файл на общем диске > ошибка
Если добавить надстройку и она будет лежать на лбом локальном диске (С/D и тд), то проблем не возникает и надстройка устанавливается В центре управления безопасности EXCEL все разрешил (вроде как). В интернете нет ничего похожего на решение.
Но! Самое главное, что неделю назад я работал на другом компе и на нем у меня получилось добавить эту надстройку по СЕТИ! Значит идея реализуема. Теперь вопрос в том, как?
Доброго всем времени суток. Работая с большой базой таблиц, есть необходимость сравнивать множество параметров, написал код чтобы сравнивать значения, но не могу "допетрить" как осуществить добавление недостающих значений. В реальном фале сравниваю много параметров, в приведенном примере ниже, всего по 3 столбца
Код
Sub Сравнить_и_добавить()
Dim i&, j&, x&, y&, LastRow_1&, LastRow_2&
Dim aaa()
Dim bbb()
LastRow_1 = Cells(Rows.Count, 1).End(xlUp).Row
LastRow_2 = Cells(Rows.Count, 6).End(xlUp).Row
ReDim aaa(LastRow_1 - 1, 2)
ReDim bbb(LastRow_2 - 1, 2)
'заполняем массивы данными
For i = 0 To UBound(aaa)
aaa(i, 0) = Cells(i + 1, 1) 'Номер1
aaa(i, 1) = Cells(i + 1, 2) 'Дата1
aaa(i, 2) = Cells(i + 1, 3) 'Условие1
Next
For j = 0 To UBound(bbb)
bbb(j, 0) = Cells(j + 1, 6) 'Номер2
bbb(j, 1) = Cells(j + 1, 7) 'Дата2
bbb(j, 2) = Cells(j + 1, 8) 'Условие2
Next
For y = 0 To UBound(aaa)
For x = 0 To UBound(bbb)
If InStr(bbb(y, 2), "IA") Then
'если номер и дата совпадают
LastRow_1 = Cells(Rows.Count, 1).End(xlUp).Row
If bbb(x, 0) = aaa(y, 0) And bbb(x, 1) = aaa(y, 1) Then
Cells(y + 1, 2).Font.Color = RGB(0, 0, 255)
ElseIf bbb(x, 0) = aaa(y, 0) And bbb(x, 1) <> aaa(y, 1) Then
Cells(y + 1, 2).Value = bbb(x, 1)
Cells(y + 1, 2).Font.Color = RGB(255, 0, 0)
End If
End If
Next
Next
End Sub
Алгоритм сравнивания: 1. Работаем если в столбце 8 есть параметр IA 2. Ищем номер из столбцов 6 в столбце 1 3. Если дата совпадает, то окрашиваем в синий, если нет, то заменяем и в красный
А вот как, если номера в столбце 1 нет! Как добавить в конец столбца?
Добрый вечер форумчане. Искал в поиске и Гугле, не смог найти ответ, возможно, на мой простой вопрос. На данном форуме нашел макрос массовой замены и решил его загнать в UserForm, чтобы данные оттуда вводить, все работает, но: Когда активируется окно UserForm, то у меня нет возможности работать с самой таблицей на листе, допустим выделить ячейку, чтобы скопировать текст из неё и вставить его в поле Формы для замены. Как это можно сделать? Пробовать в свойствах менять UserForm задавать ShowModal = False - Появляется возможность работы с таблицей, но макрос работает некорректно, а отследить не получается... [img]file:///C:/Slesar/111.jpg[/img] Помогите
Доброе утро всем! Хочется ускорить макрос, который при изменению значения определенного столбца устанавливает в соседние текущую дату и имя пользователя компьютера:
Код
Sub DateName(Target As Range, KeyCells As Range)
If Not Application.Intersect(KeyCells, Target) Is Nothing Then
Target.Offset(0, 2).Value = Date
Target.Offset(0, 3).Value = Application.UserName
Target.Offset(0, 4).Value = Time
End If
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
On Error Resume Next
'столбец куда вносятся изменения
Col_tag = Range("A1:AM5").Find("STATUS", , xlValues, xlWhole).Column
'столбец куда "вставляется" имя пользователя, чтобы потом его поменять
Col_Sig = Range("A1:AM5").Find("Signature", , xlValues, xlWhole).Column
lLastRow = Cells(Rows.Count, Col_tag).End(xlUp).Row
'при изменении столбца Col_tag, записываем дату, имя пользователя и время
DateName Target, Range(Cells(5, Col_tag), Cells(lLastRow, Col_tag))
'далее, для удобства идет переименование "имени пользователя" в реальное имя сотрудника
'для примера две замены, по факту их более 20
Range(Cells(5, Col_Sig), Cells(lLastRow, Col_Sig)).Replace What:="PC_USER1", Replacement:="IVAN IVANOV", _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _
False, ReplaceFormat:=False
Range(Cells(5, Col_Sig), Cells(lLastRow, Col_Sig)).Replace What:="PC_USER2", Replacement:="PETR PETROV", _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _
False, ReplaceFormat:=False
В общем код работает отлично, но на одну замены уходит до 1 секунды Можно ли его переделать, чтобы работал быстрее?
Создавал давно надстройку XLAM. Все работало до поры до времени, пока не добавил пару макросов (последний - массовая замена, позаимствованный с этого же форума). Не знаю, в чем причина, и где копать, но почти на все макросы у меня одна и та же ошибка вылезает: "Method or data member not found", везде, где есть строчка кода " Selection. " Как я понял проблему, что код при этом обращается к текущей топологии надстройки, а не к активной книге... может я и ошибаюсь [img]file:///C:/Slesar/Macr.jpg[/img]
Добрый день, специалисты VBA Есть вопрос, который хочется автоматизировать через VBA. Ниже скрипт VBS, который открывает telnet, заходит на коммутатор по IP и сбрасывает ошибки, данные по IP берет построчно из текстового файла DATA.txt (который должен находится в директории с исходным файлом VBS)
Код VBS
Код
Dim strSourceFile
Dim oShell
Dim objFSO
Dim strLine
Dim TimeSleep
Set oShell = wscript.CreateObject("WScript.Shell")
oShell.Run "telnet.exe"
TimeSleep = 500
wscript.Sleep 2000
strSourceFile = "DATA.txt"
With wscript.CreateObject("Scripting.FileSystemObject")
If .FileExists(strSourceFile) Then
With .OpenTextFile(strSourceFile)
Do Until .AtEndOfStream
strLine = .ReadLine()
oShell.SendKeys "o " & strLine
oShell.SendKeys "{Enter}"
wscript.Sleep TimeSleep
oShell.SendKeys "admin"
oShell.SendKeys "{Enter}"
wscript.Sleep TimeSleep
oShell.SendKeys "admin"
oShell.SendKeys "{Enter}"
wscript.Sleep TimeSleep
oShell.SendKeys "^(S)"
wscript.Sleep TimeSleep
****
oShell.SendKeys "{F}"
oShell.SendKeys "{Enter}"
wscript.Sleep TimeSleep
Loop
.Close
End With
Else
wscript.echo "Can't find [" & strSourceFile & "]."
wscript.Quit 1
End If
oShell.SendKeys "{Q}"
oShell.SendKeys "{Enter}"
End With
wscript.echo "Выполнено"
Хочется, чтобы этот код вызывался из EXCEL, а данные брал из таблицы, типо:
Код
Application.InputBox(Prompt:="Укажите диапазон IP адресов для Сброса Alarms:", Type:=8)
Уважаемы форумчане, возникла проблема, когда ребенок, случайно на диске удалил часть данных, в том числе системных, и одну из моих НАДСТРОЕК для EXCEL. Копии данного файла не имею, очень обидно потерять хоть небольшие, но все же разработки чайника.
Вопрос 1: хранит ли где-либо EXCEL резервные копии надстроек?
Вопрос 2: Программой восстановление RECUVA мне удалось его восстановить, но восстановился неправильно:
Имя файла: Slesar_IO.xla Путь: C:\Users\z003s15s\AppData\Roaming\Microsoft\AddIns Размер: 139 КБ (142 336) Состояние: Утрачен Примечание: Файл перезаписан с помощью "C:\Users\z003s15s\AppData\Local\Microsoft\Device Metadata\dmrc.idx"
При открытии данной надстройки, пишет: что данный формат файла отличается от расширения (((
Есть ли возможность восстановить прежний файл надстройки?
В прикрепленных файлах: 1. Старый файл надстройки (Slesar_IO_Old.xla) начальный вариант (для примера что было из первоначальных сохранений) 2. Полный\восстановленный, но поврежденный файл надстройки (Slesar_IO.xla)
Доброе утро форумчане Вопрос таков: в книге у меня несколько листов, при открытии книги у меня выполняется макрос:
Код
Private Sub Workbook_Open()
On Error Resume Next
'убираем фильтры со всех листов
Dim i&
For i = 1 To Sheets.Count
If Sheets(i).FilterMode = True Then Sheets(i).ShowAllData
Next i
Worksheets("IEC-61850").Activate
Call Data_List_Status
Worksheets("MODBUS_TCP").Activate
Call Data_List_Status
Worksheets("SCADA").Activate
Call Data_List_Status
Worksheets("PMS_LSS").Activate
Call Data_List_Status
Worksheets("ELSS").Activate
Call Data_List_Status
Worksheets("Main").Activate
End Sub
Модуль вызываемого макроса "Data_List_Status" делает ряд операций. Но при работе все листы по очереди активируются/переключаются. А можно ли сделать выполнение фоном без динамических переключений листов?
Добрый вечер, форумчане. На определенной таблице использую userForm Checkbox (выбор галочками) для скрытия и отображения строк по условиям.
Код
Public ESS_num&
Private Sub CheckBox1_Click()
If CheckBox1.Value = True Then
ESS_num = Range("B4:B35").Find("CCB-020", , xlValues, xlWhole).Row
Rows(ESS_num).Select
Selection.EntireRow.Hidden = True
Else
ESS_num = Range("B4:B35").Find("CCB-020", , xlValues, xlWhole).Row
Rows(ESS_num).Select
Selection.EntireRow.Hidden = False
End If
End Sub
В диапазоне B4:B35 ищу значение CCB-020 и скрываю. Когда я убираю галочку, по логике строка должна обратно отображаться... Но после скрытия макрос не может найти значение "CCB-020". Как можно обойти, исправить? Спасибо.
Далее я создаю новый (с таким же именем), на который далее будут ссылаться формулы. Но при обычном find&relace диапазона, где находятся мои формулы excel пишет что данные для ввода не найдены... в Чем причина, и как это можно выполнить. Алгоритм, чтобы потом макрос замены написать. Кто-то мне говорил, что это проблема при работе с определенными функциями типа СЧЕТЕСЛИ и т.п.. так ли это?
Добрый день, форумчане! Интересует такой вопрос: Есть макрос, который на листе выставляет даты и имя пользователя в соседних ячейках, если были изменения в заданном столбце (диапазоне)
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("A1:A50")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Target.Offset(0, 2).Value = Date
Target.Offset(0, 3).Value = Application.UserName
End If
End Sub
Проблема с тем, что в книге много листов, и в каждом листе диапазон, который "контролирует" изменения разный, в этом примере Range("A1:A50"), на другом листе может быть Range("B1:B50") и тд Я хотел задать переменную (и для каждого листа руками его прописывать) для диапазона и вызывать данный макрос для каждого листа отдельно (из модуля может быть?) А как это осуществить не могу разобраться!
Ночи доброй всем! Ругается на код, где я использую двойную проверку на ошибки, вот часть макроса (копирование листа из другой книги с использованием UserForms):
Код
Public List
With ActiveWorkbook
On Error GoTo Error1
Call List_copy ' выполняется Активация User формы, где из сплывающего списка необходимо выбрать название листа, который нужно копировать
.Sheets(List).Copy before:=BazaWb.Sheets(1)
GoTo Ends:
Error1:
On Error GoTo Error2
List = InputBox("Данный лист не найден, введите название листа вручную", "IO", "")
.Sheets(List).Copy before:=BazaWb.Sheets(1)
GoTo Ends:
Error2:
MsgBox ("Дынный лист не найден, проверьте правильность написания и повторите процедуру") Exit Sub '? здесь процедуру заканчивать
Ends:
End With
Workbooks(oAwb).Close False 'Закрываем книгу
И вот здесь у меня ругается на 11 строку. Вроде на мой (любительский) взгляд правильно. Может грамматика? подскажите
Добрый день Подскажите правильность написание, не могу сообразить: В макросе для условного форматирования есть формула: "=$U5=""FAIL""" (при значения значении в столбце U = FAIL будет окрашиваться вся строка) Но мне необходимо значение ячейки $U5 - прописать переменной (определенная ячейка, по своим условия) Код
Добрый день Всем! Можно ли осуществить такое сравнение? 1. Сравниваются таблицы на 2 листах в разных файлах. Основное сравнение происходит по одному столбцу 2. Сравниваем первые столбцы (A) по критериям: а) Ищем значение ячейки А1 во втором листе I. Найдено в той же строке что и в первом листе = сравниваем ВЫБОРОЧНЫЕ столбцы (B,D,F), если значения совпадают никаких действий, иначе окрашиваем значение в первом листе (YELLOW) II. Найдено в другой строке = также сравниваем (окрашиваем или нет) и в столбце "G" пишем номер строки из второго листа, где нашли наше значение А1 III. Не найдено - окрашиваем(RED) пишем в строке Е="NOT USE" б) Теперь необходимо сравнить в обратную сторону значения столбцов А. То есть, остались ли во втором листе Значения, которых нет в первом листе Если во втором листе найдено значение, которого нет в первом, то во втором листе окрашиваем (RED), либо на первом листе в столбце Е вывести значения, которые не найдены
В приложенных файлах Examples - визуальный пример
030_1 и 030_2 - файлы, которые в итоге надо сравнить
Изменено: slesarok - 02.12.2017 12:35:53(Уважаемые модераторы, удалите тему. Я подготовлю файлы. И позже прикреплю вопросы по которым не могу решить задание до конца! Спасибо)
Добрый день Форумчане! Темы подобные были, но я не смог найти решения по своему ответу. Есть несколько таблиц (для удобства в архиве я сделал две 001.xlsm и 800.xlsm) а также общий файл Status_Common.xlsm В Status_Common.xlsm 3 листа: 1 - общая сводная информация, а также 2 листа, в которых подтягивается информация с книг 001 и 800. Для каждого из листов 001 и 800 Прописан простой макрос копирования информации:
Код
Sub ESS_800()
Dim sFilePath As String, sFileName As String, sSh As String
Dim sStr As String
Worksheets("800").Select
Range("B5:Y19").Select
Selection.NumberFormat = "[<>0]General;"
sFilePath = Dir(ThisWorkbook.Path & "*.xlsm")
sFileName = "800.xlsm"
sSh = "Main"
With Range("B5:Y19")
.Formula = "='" & sFilePath & "[" & sFileName & "]" & sSh & "'!" & "B5"
.Value = .Value
End With
End Sub
Здесь я применил ThisWorkbook.Pathчтобы обновления происходили из текущей папки, где находится общий файл (Status_Common.xlsm). Так как при работе с этими файлами иногда приходится их копировать в другие места, отсылать и тд (и директория всегда разная)
А на главном листе вывел кнопку для объединения этих макросов:
Код
Sub Обновить_значения()
Call Sheets("001").ESS_001
Call Sheets("800").ESS_800
Worksheets("Total").Select
End Sub
Но все равно (при нажатии кнопки обновления) он просит указать директорию первого обновляемого файла (в моем случае 001), а потом сам обновляет остальные.
Как исправить чтобы обновление происходило само, относительно текущего расположения файла?
Добрый День форумчане! Помогите разобраться с проблемой: 1. В файле вкладка C&E1, в которой находится таблица причинно-следственных связей алгоритмов работы, в которой необходимо ставить отметки (выполнено/не выполнено). Реализовал так: английские буквы X и T - условие не выполнено, русские буквы Х и Т - условие выполняется. Написал макрос как отдельный модуль (вывел на кнопки) выделил область>нажал ВЫПОЛНЕНО>заменились буквыSub Replace_DONE()
Код
Selection.Replace What:="X", Replacement:="Х", _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _
False, ReplaceFormat:=False
Selection.Replace What:="T", Replacement:="Т", _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _
False, ReplaceFormat:=False
End Sub
Sub Replace_NOT_DONE()
Selection.Replace What:="Х", Replacement:="X", _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _
False, ReplaceFormat:=False
Selection.Replace What:="Т", Replacement:="T", _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _
False, ReplaceFormat:=False
End Sub
и также макрос в лист/вкладку (для визуализации), который окрашивает буквы в цвета - (Икс/Т.англ & Ха/Т.рус) красный и зеленый соответственно.Private Sub
Код
Worksheet_Change(ByVal Target As Range)
Dim Rng As Range
Dim n
With Worksheets("C&E1") '!!!!!!!!!!!!!!!!!!!!!!!!!!!
Set Rng = Selection
For Each n In Rng
Select Case n
Case "X"
n.Interior.Color = RGB(255, 200, 200)
Case "T"
n.Interior.Color = RGB(255, 200, 200)
Case "Х"
n.Interior.Color = RGB(0, 255, 0)
Case "Т"
n.Interior.Color = RGB(0, 255, 0)
End Select
Next n
End With
End Sub
Если я выделяю небольшую область (к примеру 20х20 ячеек), то макрос работает быстро, а если больше.... то обработка занимает очень долгое время, тупит, зависает. Может кто подскажет мне, как можно реализовать поинтереснее?
2. И второй вопрос: На первой вкладке Main формируется подсчет (выделил желтым), относительно вкладки C&E1. Реализовано все формулами, возможно ли осуществить макросом?