Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
VBA - Ошибка при сравнении списков, Не могу найти причину ошибки 424
 
Товарищи, подскажите почему возникает ошибка в макросе. Останавливается на строке 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
Изменено: etrusk - 11.08.2023 15:09:11
VBA: обработка 900 строк занимает более 1,5 минут
 
Товарищи, подскажите где я "накрутил" ненужное или куда думать чтоб оптимизировать код:
Код
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

всё работает корректно, но долго.
[ Закрыто] VBA: Оптимизация кода
 
Товарищи, подскажите в какую сторону думать чтоб оптимизировать код:
Код
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 строк занимает порядка полутора минут. Где я накрутил ненужное?
VBA: Макрос работает в режиме отладки и не работает в нормальном
 
Товарищи, нужна Ваша помощь.
Озаботился созданием собственной надстройки, для этого пришлось переносить макросы из личной книги, с некоторыми доделками, в файл будущей надстройки. Столкнулся с проблемой - в режиме отладки всё работает как задумывалось, а когда запускаю в рабочем режиме, то как вроде пропускает часть кода. Например не производит форматирование на вновь созданном листе и не передвигает его в конец.

В двух словах работа макроса. Есть журнал заявок, в нём создана сводная таблица. Фильтром сводной идёт перебор электромехаников с открытием деталей. Лист с деталями сводной таблицы копируется в новую книгу на новый лист, там он форматируется и т.п. Макрос действует пока не переберет всех электромехаников в сводной.

Запускается всё на вкладке LTS-Red, кнопка Раздача.
Для работы Журнал заявок должен быть открыт.

Подскажите пожалуйста в чём проблема.

файлы:
https://yadi.sk/i/ByTpdC9J3Sbm5J
https://yadi.sk/d/bs90_9Z83Sbm7K
Изменено: etrusk - 20.02.2018 14:22:50
Не проходит проверку равенства значения comboBox с значением ячейки
 
Товарищи, просьба помочь найти где я ошибся.
при запуске анализа таблицы (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
Если нужен сам файлик, тоже сброшу.
VBA. Наполнение ComboBox
 
Товарищи, подскажите в чем ошибка.
На форме нужно наполнить 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
VBA. Копирование диапазонов
 
Здравствуйте. Товарищи, нужна помощь.
При копировании макросом диапазона ячеек из файла в файл (или с листа на лист, не важно), вставленный диапазон остается выделенным. Если этот диапазон анализировать или обрабатывать далее этим же макросом это существенно замедляет работу макроса. Помогает строчка типа:
Код
cells(1, 1).Select
А потом уже дальнейший код по обработке.
Но по-моему это какое-то корявое решение вопроса. Есть ли способ как-то убирать выделение вставленного диапазона?
Изменено: etrusk - 06.07.2016 15:02:12
VBA. Копирование диапазона данных из другого файла
 
Товарищи, подскажите в чем может быть загвоздка. Пытаюсь макросом скопировать диапазон данных из другого файла, предварительно открытого. Вот код:
Код
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 строки), то ошибка не выдаётся, всё выделяет и копирует.
Может я где-то на ровном месте торможу? Если необходимо выложу файлы.
Изменено: etrusk - 27.06.2016 14:38:29
VBA: Заполнение значения выпадающего списка
 
Здравствуйте. Товарищи, подскажите в чем ошибка.
На основной форме при включении CheckBox "Отнести к предыдущему" нужно чтоб заполнялись значения выпадающих списков "улица", "дом" и "подъезд" из уже заполненных ячеек таблицы. Заполняет только "Улица". В остальном выдает ошибку 380 с "не удалось установить свойство значения".
Как решить проблему не придумывается.

Файл почему-то не добавился. Сейчас исправлю...
Изменено: etrusk - 04.04.2016 09:59:52
VBA: двойной показ msgBox
 
Здравствуйте товарищи.
Столкнулся с проблемой. Написал во этот код:
Код
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 раза сообщение долбит. Может кто сталкивался? Как избавится от второго сообщения, а ошибочную установку флажка снять?
VBA: Заполнение значениями ComboBox
 
Здравствуйте. Товарищи, нужна подсказка.
Задумал я создать взаимозависимые выпадающие списки пользовательской формы. Т.е. при выборе значения первого 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, а мне нужны только уникальные значения. Это можно как-то сделать?
Изменено: etrusk - 10.03.2016 11:01:42
vba: Проверка условия
 
Товарищи, написал небольшую программку, аналог ВПР, только поиск не по одному критерию, а по трем. Все работает, но не придумаю как прописать условие на случай отсутствия совпадений. Вот часть кода:
Код
    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

само-собой успехом не увенчались. Подскажите как быть.
VBA: удаление строк
 
Товарищи, подскажите как написать макрос на удаление строк.

Есть таблица на несколько сотен строк, нужно макросом удалить все кроме скажем первой или первых двух.
Первое что пришло в голову определить кол-во строк в табличке, сделал так:
Код
   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

но так, как я и подозревал, очень долго работает.
Избавиться от select при вырезать/вставить
 
Товарищи, подскажите можно ли при вырезке данных из диапазона ячеек и вставке этих данных в другой избавиться от "select"?
простой пример:
Код
Range("A1:A6").Cut
Range("D1").Select
ActiveSheet.Paste

манипуляции типа: Range("D1").Paste само-собой ни к чему не привели
Изменено: etrusk - 11.01.2016 23:28:55
переменная в фильтре
 
Здравствуйте уважаемые. Поставил себе задачу написать макрос который будет выставлять нужные мне фильтры в табличке (кнопочка "форма"). Описал различные варианты выбора через "if...". Все вроде работает, но понял что все это будет работать только в 2016 году.
т.е. строку
Код
ActiveSheet.ListObjects("grafik_TO_tb").Range.AutoFilter Field:=8, Operator:=xlFilterValues, Criteria2:=Array(1, "2/2/2016")
и ей подобные нужно корректировать при работе в 2017 году, а их не мало. Можно ли "2016" сделать переменной?
И второй вопросик, можно ли такого рода программку написать менее громоздко, не через if, elseif?
Буду очень признателен за подсказку.
В VBA делаю первые шаги, возможно ответ где-то на поверхности, но я его не знаю.

p.s. табличка в итоге будет более 900 строк, пока создал абстрактные 6 для обкатки.
Изменено: etrusk - 21.12.2015 00:09:37
Страницы: 1
Наверх