Товарищи, подскажите почему возникает ошибка в макросе. Останавливается на строке 18 с кодом ошибки 424. В закомментированных строках Debug.Print выдаёт правильные значения.
Код
Dim ShData As Worksheet
Dim ListObj As ListObject
Dim ListR As ListRow
Dim a As Variant
Dim i As Byte
Set ShData = ThisWorkbook.Worksheets("data")
Set ListObj = ShData.ListObjects("работник_тб")
Set ListR = ListObj.ListRows(1)
If cbx_exclude.Value = True Then
cmb_rabotnik.RowSource = ""
With CreateObject("scripting.dictionary")
For Each ListR In ListObj.ListRows
' Debug.Print uf_inputData.lbx_rabotniki.List(i, 0)
' Debug.Print ListR.Range(1).Value
For i = 0 To uf_inputData.lbx_rabotniki.ListCount
If ListR.Range(1).Value = uf_inputData.lbx_rabotniki.List(i, 0).Value Then
.Item(ListR.Range(1).Value) = vbNullString
End If
Next i
Next
a = .keys
End With
uf_inputData.cmb_rabotnik.List = Application.Transpose(a)
Else
cmb_rabotnik.RowSource = "работник_тб"
End If
Товарищи, подскажите где я "накрутил" ненужное или куда думать чтоб оптимизировать код:
Код
Sub EditNextYear(ByRef yeargraf As Integer, wbName As String)
Dim DatListObj As ListObject
Dim DatListRow As ListRow
With Workbooks(wbName).Sheets("график ТО")
.Activate
' редактирование нового графика ТО
.Range("grafik_TO_tb[дата ТО/ диагн.]").ClearContents
.Range("grafik_TO_tb[№ акта ТО]").ClearContents
.Range("grafik_TO_tb[дата согласов.]").ClearContents
.Range("grafik_TO_tb[организация проводившая ТО]").ClearContents
.Range("grafik_TO_tb[дата след. ТО]").Cut Range("grafik_TO_tb[дата ТО/ диагн.]")
End With
Set DatListObj = Workbooks(wbName).Worksheets("график ТО").ListObjects("grafik_TO_tb")
Set DatListRow = DatListObj.ListRows(1)
yeargraf = Year(DatListRow.Range(13))
For Each DatListRow In DatListObj.ListRows
If DatListRow.Range(17).Value <> "" Then
DatListRow.Range(12).Value = DatListRow.Range(17).Value
DatListRow.Range(17).Value = ""
End If
If DatListRow.Range(25).Value <> "" And Year(DatListRow.Range(25)) = yeargraf - 1 Then
DatListRow.Range(12).Value = DatListRow.Range(25).Value
End If
If DatListRow.Range(27).Value <> "запрет" Then
If Year(DatListRow.Range(27)) = yeargraf Or Year(DatListRow.Range(27)) < yeargraf Then
DatListRow.Range(31).Value = "диагностика"
Else
DatListRow.Range(31).Value = "т/о"
End If
End If
Next DatListRow
Workbooks(wbName).Sheets("график ТО").Range("grafik_TO_tb[дата ТО/ диагн.]").NumberFormat = "mmm/yyyy"
End Sub
Товарищи, подскажите в какую сторону думать чтоб оптимизировать код:
Код
Sub EditNextYear(ByRef yeargraf As Integer, wbName As String)
Dim DatListObj As ListObject
Dim DatListRow As ListRow
With Workbooks(wbName).Sheets("график ТО")
.Activate
' редактирование нового графика ТО
.Range("grafik_TO_tb[дата ТО/ диагн.]").ClearContents
.Range("grafik_TO_tb[№ акта ТО]").ClearContents
.Range("grafik_TO_tb[дата согласов.]").ClearContents
.Range("grafik_TO_tb[организация проводившая ТО]").ClearContents
.Range("grafik_TO_tb[дата след. ТО]").Cut Range("grafik_TO_tb[дата ТО/ диагн.]")
End With
Set DatListObj = Workbooks(wbName).Worksheets("график ТО").ListObjects("grafik_TO_tb")
Set DatListRow = DatListObj.ListRows(1)
yeargraf = Year(DatListRow.Range(13))
For Each DatListRow In DatListObj.ListRows
If DatListRow.Range(17).Value <> "" Then
DatListRow.Range(12).Value = DatListRow.Range(17).Value
DatListRow.Range(17).Value = ""
End If
If DatListRow.Range(25).Value <> "" And Year(DatListRow.Range(25)) = yeargraf - 1 Then
DatListRow.Range(12).Value = DatListRow.Range(25).Value
End If
If DatListRow.Range(27).Value <> "запрет" Then
If Year(DatListRow.Range(27)) = yeargraf Or Year(DatListRow.Range(27)) < yeargraf Then
DatListRow.Range(31).Value = "диагностика"
Else
DatListRow.Range(31).Value = "т/о"
End If
End If
Next DatListRow
Workbooks(wbName).Sheets("график ТО").Range("grafik_TO_tb[дата ТО/ диагн.]").NumberFormat = "mmm/yyyy"
End Sub
Всё работает норм, но обработка таблицы в 900 строк занимает порядка полутора минут. Где я накрутил ненужное?
Товарищи, нужна Ваша помощь. Озаботился созданием собственной надстройки, для этого пришлось переносить макросы из личной книги, с некоторыми доделками, в файл будущей надстройки. Столкнулся с проблемой - в режиме отладки всё работает как задумывалось, а когда запускаю в рабочем режиме, то как вроде пропускает часть кода. Например не производит форматирование на вновь созданном листе и не передвигает его в конец.
В двух словах работа макроса. Есть журнал заявок, в нём создана сводная таблица. Фильтром сводной идёт перебор электромехаников с открытием деталей. Лист с деталями сводной таблицы копируется в новую книгу на новый лист, там он форматируется и т.п. Макрос действует пока не переберет всех электромехаников в сводной.
Запускается всё на вкладке LTS-Red, кнопка Раздача. Для работы Журнал заявок должен быть открыт.
Товарищи, просьба помочь найти где я ошибся. при запуске анализа таблицы (2 страница книги) всё работает корректно, кроме анализа по "год проведения". Запустив отладчик, понял что не проходит проверку равенства значения comboBox с значением ячейки. Абсолютно не пойму почему, сделал так же как анализ по "вид работ" или "Управляющая компания", но не работает. Вот ссылка на файл: https://yadi.sk/d/POi4HwHz3EsdzU
Здравствуйте. Товарищи, подскажите почему неполноценно работает подсвечивание выходных дней в графике работ который я делаю. Определяю выходной день по простой формуле: =ДЕНЬНЕД(B2;2)>5 диапазон применения задаю =$B$3:$B$6
Всё почему-то работает только для ячейки B3. Ячейки B4:B6 остаются покрашенными/не покрашенными не смотря на изменение числа в ячейке B2. В чём тут дело? Может я где-то не вижу очевидного?
Здравствуйте товарищи. Помогите решить задачку. Появилась необходимость проанализировать старые учетные данные, данные в ячейках различаются цветом шрифта. Написал небольшой макрос чтоб подсчитывал количество ячеек с шрифтом определённого цвета в выделенной области. Всё работает пока не натыкается на ячейку где шрифт выделен двумя разными цветами. Выдаёт ошибку "run-time 94. Invalid use of Null". Не знаю как побороть. Вот сам код:
Код
Sub ПроверкаЖурналаЗаявок()
Dim rngX As Range
Dim c As Range
Dim i As Integer
Dim iM As Integer
Dim iP As Integer
Dim colF As Double
Set rngX = Selection
Set c = rngX.Cells
i = 0
iM = 0
iP = 0
For Each c In rngX
If c.Value <> "" Then
i = i + 1
colF = c.Font.Color
If colF = 1842204 Or colF = 1118481 Or colF = 0 Then
iM = iM + 1
End If
If colF = 255 Or colF = 204 Then
iP = iP + 1
End If
End If
Next c
Debug.Print "всего "; i
Debug.Print "выход мех."; iM
Debug.Print "простоев"; iP
i = i - iM - iP
Debug.Print "аварийка"; i
End Sub
Товарищи, подскажите в чем ошибка. На форме нужно наполнить ComboBox списком каталогов по определенной маске. Не могу понять почему не заполняет. Если вывожу список в окошко Immediate, то всё работает.
Код
Sub FillYear()
Dim coll
Dim i As Byte
Dim PathDir As String
PathDir = ThisWorkbook.Path & "\"
Set coll = SubFoldersCollection(PathDir, "20##")
For i = 1 To coll.Count
' Debug.Print coll(i)
Form_Selection.cmb_year.AddItem coll(i)
Next i
End Sub
Function SubFoldersCollection(ByVal FolderPath$, Optional ByVal Mask$) As Collection
Dim FSO As Object
Dim curfold As Object
Dim folder As Object
Set SubFoldersCollection = New Collection
Set FSO = CreateObject("Scripting.FileSystemObject")
On Error Resume Next: Set curfold = FSO.GetFolder(FolderPath$)
For Each folder In curfold.SubFolders
If folder.Path Like FolderPath$ & Mask$ Then SubFoldersCollection.Add Right(folder.Path, 4)
Next folder
Set FSO = Nothing
End Function
Здравствуйте. Товарищи, нужна помощь. При копировании макросом диапазона ячеек из файла в файл (или с листа на лист, не важно), вставленный диапазон остается выделенным. Если этот диапазон анализировать или обрабатывать далее этим же макросом это существенно замедляет работу макроса. Помогает строчка типа:
Код
cells(1, 1).Select
А потом уже дальнейший код по обработке. Но по-моему это какое-то корявое решение вопроса. Есть ли способ как-то убирать выделение вставленного диапазона?
Товарищи, подскажите в чем может быть загвоздка. Пытаюсь макросом скопировать диапазон данных из другого файла, предварительно открытого. Вот код:
Код
Sub CopyDataJournal()
Dim lRow As Long
Dim ishodnik As Workbook
Set ishodnik = Workbooks("Журнал заявок 2016 г..xls")
ishodnik.Sheets(1).Columns(5).EntireColumn.Hidden = False
ishodnik.Sheets(1).Columns("J:L").EntireColumn.Hidden = False
lRow = ishodnik.Sheets(1).Cells(Rows.Count, 16).End(xlUp).Row
ishodnik.Sheets(1).Range(Cells(2, 1), Cells(lRow, 16)).Copy
lRow = ThisWorkbook.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row + 1
ThisWorkbook.Sheets(1).Range(Cells(lRow, 1)).PasteSpecial Paste:=xlPasteValues
End Sub
Мне не понятно почему выдаёт ошибку "Run-Time Error 1004" на строке 12. Причем если если закомментировать две последующие (13, 14 строки), то ошибка не выдаётся, всё выделяет и копирует. Может я где-то на ровном месте торможу? Если необходимо выложу файлы.
Здравствуйте. Товарищи, подскажите в чем ошибка. На основной форме при включении CheckBox "Отнести к предыдущему" нужно чтоб заполнялись значения выпадающих списков "улица", "дом" и "подъезд" из уже заполненных ячеек таблицы. Заполняет только "Улица". В остальном выдает ошибку 380 с "не удалось установить свойство значения". Как решить проблему не придумывается.
Здравствуйте товарищи. Столкнулся с проблемой. Написал во этот код:
Код
Private Sub CheckBox1_Click()
If Cells(11, 1) <> "" Then
If General.CheckBox1.Value = True Then
With General.cmb_street
.Locked = True
.BackColor = RGB(240, 240, 240)
End With
Else
With General.cmb_street
.Locked = False
.BackColor = ColorConstants.vbWhite
End With
End If
Else
General.CheckBox1.Value = False
MsgBox "Невозможно." & vbCr & "Таблица не заполнена", vbCritical, "Ошибка!"
End If
End Sub
Все работает, но есть проблемка - сообщение msgBox выдает 2 раза подряд. Прошел код пошагово - обнаружил причину в снятии флажка с CheckBox1, от этого 2 раза сообщение долбит. Может кто сталкивался? Как избавится от второго сообщения, а ошибочную установку флажка снять?
Здравствуйте. Товарищи, нужна подсказка. Задумал я создать взаимозависимые выпадающие списки пользовательской формы. Т.е. при выборе значения первого ComboBox должно меняться наполнение второго, от него зависящего. Для этого написал вот такой код:
Код
Private Sub cmb_street_Change()
Dim DatListObj As ListObject
Dim DatListRow As ListRow
Set DatListObj = ThisWorkbook.Worksheets("данные").ListObjects("mehanic_tb")
Set DatListRow = DatListObj.ListRows(1)
For Each DatListRow In DatListObj.ListRows
If DatListRow.Range(1) = cmb_street Then
General.cmb_house.AddItem DatListRow.Range(2)
End If
Next DatListRow
End Sub
Все заработало, но есть беда - если совпадений много, то их все насыпает в cmb_house, а мне нужны только уникальные значения. Это можно как-то сделать?
Товарищи, написал небольшую программку, аналог ВПР, только поиск не по одному критерию, а по трем. Все работает, но не придумаю как прописать условие на случай отсутствия совпадений. Вот часть кода:
Код
Dim DatListObj As ListObject
Dim DatListRow As ListRow
Dim adres As String
Set DatListObj = ThisWorkbook.Worksheets("data").ListObjects("mehanic_tb")
Set DatListRow = DatListObj.ListRows(1)
adres = cmb_street & txb_house & txb_lift
For Each DatListRow In DatListObj.ListRows
If DatListRow.Range(1) & DatListRow.Range(2) & DatListRow.Range(3) = adres Then
Exit For
End If
Next DatListRow
Хочу прописать условие, чтоб в случае отсутствия совпадений выдавало сообщение об этом. мои попытки что-то сделать типа:
Код
If DatListRow = Nothing Then MsgBox "нет такого!"
GoTo ending
End If
само-собой успехом не увенчались. Подскажите как быть.
Товарищи, подскажите как написать макрос на удаление строк.
Есть таблица на несколько сотен строк, нужно макросом удалить все кроме скажем первой или первых двух. Первое что пришло в голову определить кол-во строк в табличке, сделал так:
Код
Dim nRow As Integer
nRow = Range("grafik_PPR_tb").Rows.Count
а потом, зная количество строк в таблице, удалить диапазон строк на 1 или 2 строки меньше. Но следующая строка кода типа:
Код
Rows(6:nrow+5).Delete Shift:=xlUp
явно не правильная. Тут мне явно не хватает знаний.
Пробовал сделать так:
Код
Dim nRow As Integer
nRow = Range("grafik_PPR_tb").Rows.Count
For i = nRow To 6 Step -1
If i > 6 Then
Rows(i).Delete
End If
Next i
Здравствуйте уважаемые. Поставил себе задачу написать макрос который будет выставлять нужные мне фильтры в табличке (кнопочка "форма"). Описал различные варианты выбора через "if...". Все вроде работает, но понял что все это будет работать только в 2016 году. т.е. строку
и ей подобные нужно корректировать при работе в 2017 году, а их не мало. Можно ли "2016" сделать переменной? И второй вопросик, можно ли такого рода программку написать менее громоздко, не через if, elseif? Буду очень признателен за подсказку. В VBA делаю первые шаги, возможно ответ где-то на поверхности, но я его не знаю.
p.s. табличка в итоге будет более 900 строк, пока создал абстрактные 6 для обкатки.