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

Страницы: 1 2 След.
VBA не находит ячейку по названию месяца
 
В ячейке A1 находится дата 01.01.2025 и отформатирована как "ММММ" и в ячейке отображается как "Январь". Поиском слово январь находится, но вот VBA через Find наотрез отказывается искать.
Код
Sub Дата()
Dim a As Range
Range("A1") = DateSerial(2025, 1, 1)
Set a = Range("A1").Find("Январь", , xlValues, xlPart)
If a Is Nothing Then
Debug.Print ("значение не найдено")
Else
Debug.Print ("Январь")
End If
End Sub
Изменено: olege1983 - 16.04.2025 06:50:51
Простейший код выдаёт ошибку
 
Код ниже выдаёт ошибку:
Run-time error 1004. Application-defined or object-defined error.
Ошибка возникает только в одной книге. В новой и других - код работает нормально. Ошибка везде неважно какая ячейка или лист.
Код
Sub Test
Range("A1").Activate 
End sub
Vba ругается на if внутри функции
 
Два дня не могу понять в чем ошибка, вроде все скобки верно расставлены, а VBA неугомонный выдает ошибку Compile error, explected и выделяет if isserr. Данное содержание работает если вписать его в ячейку в качестве формулы, но почему то не работает в VBA.
Код
Sub Сек()
Dim Typ As String 
Dim Curr As String 
Dim Ps As String 
Dim Vid As String 
Dim nCurr As Integer 
Dim nPs As Integer 
Dim nVid As Integer 
Dim I As Integer
Dim yach As Byte
nPs = WorksheetFunction.Match("Тип", Range("A14:Z14"), 0)
nCurr = WorksheetFunction.Match("Вид", Range("A14:Z14"), 0)
nVid = WorksheetFunction.Match("наименование", Range("A14:Z14"), 0)
Set adrCurr = Cells(14, nCurr)
Set adrPs = Cells(14, nPs)
'MsgBox (adrCurr.Value)

For I = 16 To 16

If Cells(I, nCurr).Value = "Оборудование" Then
    If Cells(I, nPs).Value = "ST=7" Or Cells(I, nPs).Value = "С2" Then
        if Right(Cells(I, nVid).Value, 2) = "№1" Or Mid(Cells(I, nVid).Value, WorksheetFunction.Search("яч", Cells(I, nVid)+3), _
         if isErr(WorksheetFunction.Search(" ", Cells(I, nVid), Search("яч", Cells(I, nVid)) + 1)) = False Then _
                worksheetfucntion.len(cells(i,nvid)) - worksheetfunction.Search(" ",cells(i,nvid),search("яч", cells(i,nvid)+3) else _
                worksheetfunction.len(cells(i,nvid)) -(worksheetfunction.Search("яч",cells(i,nvid))+3 <11 or _
                chr(right(cells(i, nvid),1) < 57 then
                
                Typ = "СШ-1"
                Else
                Typ = "СШ-2"
                End If
                End If
                worksheetfucntion.Len (Cells(I, nVid))
                End Sub
Не передаются данные из формы в модуль
 

Возникает ошибка в 6 строке «Method or data member not found».

Переменная sptchar должна браться из переменной txt всплывающей формы Razdelitel, но форма не открывается и сразу выходит эта ошибка,

Код
Sub Сцепить_запятая()Dim xRg As Variant, sptChar As StringDim Concatenatevisible As StringDim Scm As New DataObjectRazdelitel.ShowsptChar = Razdelitel.tXtSet xRg = Selection    Dim rg As Range    For Each rg In xRg        If (rg.EntireRow.Hidden = False) And (rg.EntireColumn.Hidden = False) Then            Concatenatevisible = Concatenatevisible & rg.Value & sptChar        End If    Next    Concatenatevisible = Left(Concatenatevisible, Len(Concatenatevisible) - Len(sptChar))    SetClipBoardText (Concatenatevisible)       MsgBox ("Значение" & Concatenatevisible & vbCr & "скопировано в буфер")End Sub

Изменено: olege1983 - 20.09.2024 11:31:12
Excel Vba путает число и месяц местами, VBA меняет местами число и месяц
 
Есть код, при котором на лист дата выводится неверно. Код укорочен для понимания.
Код
Sub test()
Dim Dat as string
Dim cDat as date
Dim M as byte, D as byte, Y as byte
Dim NewD
Dat="10.01.2024"
cdat=cDate(Dat)
D = day(cDat)
M= month(cDat)
Y=year(cDat)
NewD = msgbox(D & "." & M & "." & Y)
End Sub

Результат кода будет 01.10.2024

Такое происходит если число до первой точки меньше или равно 12.

Как управлять textboxом через переменную, управление формой textbox через переменную, наподобие функции Двссыл.
 

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


Код
Sub Test2 
On error resume next 
dim ST() 
Dim SI
ST = array(Textbox1, Textbox2, Textbox3)
SI = ST(2).name 'Значение SI будет "Textbox3" 
'далее хочу чтобы в завимости от индекса ST чтобы автоматически закращивался нужный Textbox1 
SI.backcolor = vbGreen 'формула не работает, никакой Textbox не меняет цвет 
textbox3.backcolor = vbgreen ' вот так работает, но нужно указывать вручную
End sub
Изменено: olege1983 - 05.07.2024 07:31:09
Не работает надстройка
 
Надстройка должна добавлять пункт в контекстное меню.  Но пункт не появляется. Функция работает если только код ниже поместить в модуль книги:
Да и если заменить Private sub на обычный sub и запустить макрос, то пункт меню появится, но при попытке активировать кнопку выскакивает ошибка:
в строке Dim Scm As New DataObject  - compile error: user-defined type not defined (в файле надстройки ошибка есть, в модуле книги -ошибки нет)
Код
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Dim cmdBarBut As CommandBarButton
    On Error Resume Next
With Application
    .CommandBars("cell").Controls("сцепить_запятая").Delete
    Set cmdBarBut = .CommandBars("cell").Controls.Add(Temporary:=True)
End With
        With cmdBarBut
            .Caption = "сцепить_запятая"
            .Style = msoButtonCaption
            .OnAction = "сцепить_запятая"
        End With
    On Error GoTo 0
End Sub

Sub Сцепить_запятая()
Dim D As Range, R As String, BP As Boolean
Dim avData, lr As Long, lc As Long, sRes As String
Dim oDict As Object, sTmpStr
Dim Scm As New DataObject
    Set oDict = CreateObject("Scripting.Dictionary")
    oDict.comparemode = 1
    Set D = Selection
    avData = D.Value
    R = ","
    If Not IsArray(avData) Then
        Scm = avData
        Exit Sub
    End If
 
    For lc = 1 To UBound(avData, 2)
        For lr = 1 To UBound(avData, 1)
            If Len(avData(lr, lc)) Then
                sRes = sRes & R & avData(lr, lc)
                If БезПовторов Then
                    If Not oDict.exists(avData(lr, lc)) Then
                        oDict.Add avData(lr, lc), 0&
                    End If
                End If
            End If
        Next lr
    Next lc
    If Len(sRes) Then
        sRes = Mid(sRes, Len(R) + 1)
    End If
 
    If BP Then
        sRes = ""
        sTmpStr = oDict.keys
        For lr = LBound(sTmpStr) To UBound(sTmpStr)
            sRes = sRes & IIf(sRes <> "", R, "") & sTmpStr(lr)
        Next lr
    End If
Scm.SetText (sRes)
Scm.PutInClipboard
    MsgBox ("Значение" & sRes & vbCr & "скопировано в буфер")
End Sub
Изменено: olege1983 - 24.04.2024 10:11:06
не повляется пользовательский пункт контекстного меню
 
Хочу добавить свой пункт в контекстное меню. Нашел код, но ничего кроме стандартных пунктов нет
Код
Private Sub workbook_deaktivate()
On Error Resume Next
With Application
CommandBars("cell").Controls("mymacro").Delete
End With
On Error GoTo 0
End Sub
Код
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)Dim cmdBarBut As CommandBarButton On Error Resume NextWith ApplicationCommandBars("cell").Controls("MyMacro").DeleteSet cmdBarBut = .CommandBars("cell").Controls.Add(Temporary:=True)End WithWith cmdBarBut.Caption = "mymacro".Style = msoButtonCaption.OnAction = "mymacro"End With On Error GoTo 0End Sub
Изменено: olege1983 - 23.04.2024 16:13:30
Не создается именованный диапазон
 
Хочу создать макрос для создания группы именованных диапазонов. Но возникает проблема, сразу при запуске выскакивает ошибка.
Если убрать знаки $ то именованные диапазоны благополучно создаются, но не работают, ячейки которые ссылаются на них получают ошибку ИМЯ. В списке имен почему-то ячейки подсвечены одинарными кавычками =График!'CJ15':'CJ4200' (обратите внимание, в самом коде этих кавычек нет). Если убрать везде эти одинарные кавычки, то именованные диапазоны становятся работоспособными.
Код
Sub Добавить_имена()
Worksheets("График").Names.Add Name:="namecount", RefersToR1C1:="=График!$CJ$15:$CJ$4200"
Worksheets("График").Names.Add Name:="namecount2", RefersToR1C1:="=График!$CM$15:$CM$4200"
Worksheets("График").Names.Add Name:="namecount3", RefersToR1C1:="=График!$CS$15:$CS$4200"
Worksheets("График").Names.Add Name:="namecount4", RefersToR1C1:="=График!$BP$15:$BP$4200"
Worksheets("График").Names.Add Name:="namelist", RefersToR1C1:="=График!$CJ$15:$CK$4200"
Worksheets("График").Names.Add Name:="namelist2", RefersToR1C1:="=График!$CM$15:$CM$4200"
Worksheets("График").Names.Add Name:="namelist3", RefersToR1C1:="=График!$CS$15:$CT$4200"
Worksheets("График").Names.Add Name:="namelist4", RefersToR1C1:="=График!$BP$15:$CBQ$4200"
End Sub
Изменено: olege1983 - 27.03.2024 22:28:19
Код выдает ошибку Application defined or object defined error, хотя по логике не должен, Неверно работает функция match
 
Никак не пойму почему в строке "Diapazon1 =" выходит ошибка "application defined or object defined" error.
В этой строке ведется поиск позиции в заданном диапазоне фрагмента текста.
Код
Sub Заполнение()
'On Error Resume Next
Dim Naimenov As String, Diapazon1 As Integer, Diapazon2 As Integer, Diapazon As Integer
Dim Nalichie As Boolean
Dim Drabot As Range, DVstavki As Range

Dim Pr1, Pr2
For i = 16 To 16
Naimenov = Left(Range("I" & i), 7)
Select Case Naimenov
Case "Присоед", "Секцион"
Nalichie = True
End Select
If Nalichie = True Then
    Set Drabot = Range("R" & i & ":" & "AC" & i)
    Pr1 = Range("I" & i + 1 & ":" & "I1200").Address
    Diapazon1 = WorksheetFunction.Match("Присоед", Range("I" & i + 1 & ":" & "I1200"), 0) - 1
    Diapazon2 = WorksheetFunction.Match("Секцион", Range("I" & i + 1 & ":" & "I1200"), 0) - 1
    If Diapazon1 < Diapazon2 Then Diapazon = Diapazon1 + i Else Diapazon = Diapazon2 + i
    Set DVstavki = Range("R" & i + 1 & ":" & "AC" & Diapazon)
    Pr2 = DVstavki.Address
    Drabot.Copy
    DVstavki.FillDown
End If
Next i
End Sub
Excel преобразует нумерацию №п.п. в десятичную дробь
 
Почему код ниже преобразует текстовое значение в числовое:
код ниже выводит Должен выводить
I
1
1,1
0,2
0,3
0,4
2
I
1
1.1
1.2
1.3
1.4
2
т.е. заменяет точку на запятую, причем принудительный перевод в текстовый режим не срабатывает, хоть сколько вложи cstr, как только VBA увидит, к примеру связку "1.1" он сразу в ячейке ее сделает как 1,1
Код
Sub Протянуть_нумерацию()
On Error Resume Next
Dim Ch, Lh, Nh, P
Dim CRed, CBlue, CDBlue, Cwhite
Ch = 0
Nh = 0
Lh = 0
P = 0
CRed = RGB(255, 200, 180)
CBlue = RGB(221, 235, 247)
CDBlue = RGB(184, 204, 228)
Cwhite = RGB(255, 255, 255)
For i = 15 To 20
Application.StatusBar = i
If Cells(i, "D").Interior.Color = CDBlue Then
Nh = Nh + 1
Ch = WorksheetFunction.Roman(Nh)
Cells(i, "D") = Ch
Else
If Cells(i, "D").Interior.Color = Cwhite Then
Lh = Lh + 1
Cells(i, "D") = Lh
Else
If Cells(i, "D").Interior.Color = CBlue Then

    If Cells(i, "D").Interior.Color <> Cells(i - 1, "D").Interior.Color Then _
    Cells(i, "D") = CStr(Cells(i - 1, "D")) & "." & CStr(Right(Cells(i - 1, "D"), 1)) Else
    Cells(i, "D") = CStr(Left(Cells(i - 1, "D"), Len(Cells(i - 1, "D")) - 3)) & "." & _
    CStr(Right(Cells(i - 1, "D"), 1) + 1)
End If
End If
End If
Next
Application.StatusBar = False
End Sub
Неправильно считает формула Счётеслимн
 
День добрый! Есть некий файл, где необходимо программно расставить порядковые номера птиц.
В файле есть два метода: 1. Без учета этой колонки и  2.с учетом колонки А - значение "Птица"

Формула считает правильно только во 1-м случае.
В 2-ом случае подсчет идет неверный, программа почему-то учитывает ячейки с нулевой длиной (в первом случае она не считала эти ячейки).
Если ради эксперимента очистить пустые ячейки, то формулы начинают считать верно. Но в тех ячейках формула.
VBA Копирование строк с формулами со сдвигом вниз
 
Код вроде работает как бы правильно, но не правильно: он вставляет формулы не из ячейки ниже а из ячейки выше, причем не имеет значения shift:XlUp или shift:xldown
Например если скопировать строку 2 и в ячейке B2 есть ссылка на ячейку B2 другого листа, затем выполнить вставку то ссылки будут не B2 и B3, а на B1 и . Т.е. подставит значения из ячейки выше.
Код
Sub Копирование_строк()
Dim NmSh As String, NmF As String, NewWb As String
Dim Rp
Application.ScreenUpdating = False
Dim n As Integer
Dim k As Integer, k1 As Integer
Dim m As Double, m1 As Double
n = Application.InputBox("Количество вставляемых строк", , , , , , , 1)
Do While n > 1000
n = Application.InputBox("Количество вставляемых строк", , , , , , , 1)
If n > 1000 Then '1
MsgBox ("вы ввели слишком много строк")
End If
Loop
If n = 0 Then
MsgBox ("вы не ввели никаких данных")
Exit Sub
End If
For i = 1 To n
m = n Mod 10
m1 = n Mod 100
    k = n - m
    k1 = n - m1
If i <= 10 Then '2
    Rows(Selection.row & ":" & Selection.row).Select
    With Selection
        .Copy
        .Insert Shift:=xlUp
    End With
End If
If i > 10 And i <= 100 Then '3
    i = i + 9
    If i <= 10 Then  '3.1
    Rows(Selection.row & ":" & Selection.row).Select
    With Selection
        .Copy
        .Insert Shift:=xlUp
    End With
    Else
    If i > 10 And i < k Then  '3.2
    Rows(Selection.row & ":" & Selection.row - 9).Select
    With Selection
        .Copy
        .Insert Shift:=xlUp
    End With
    Else
    If i > k And i < n Then '3.3
    i = i + 1
    Rows(Selection.row & ":" & Selection.row).Select
    With Selection
        .Copy
        .Insert Shift:=xlUp
    End With
    End If '3.3
    End If '3.2
    End If '3.1
    End If  '3
If i > 100 And i <= 1000 Then '4
      i = i + 99
    If i <= 10 Then  '4.1
    Rows(Selection.row & ":" & Selection.row).Select
    With Selection
        .Copy
        .Insert Shift:=xlUp
    End With
    Else
    If i > 10 And i < k Then  '4.2
    Rows(Selection.row & ":" & Selection.row - 9).Select
    With Selection
        .Copy
        .Insert Shift:=xlUp
    End With
    Else
    If i > 100 And i < k1 Then  '4.3
    Rows(Selection.row & ":" & Selection.row - 99).Select
    With Selection
        .Copy
        .Insert Shift:=xlUp
    End With
    Else
    If i > k And i < n Then '4.4
    i = i + 1
    Rows(Selection.row & ":" & Selection.row).Select
    With Selection
        .Copy
        .Insert Shift:=xlUp
    End With
    End If
    End If
    End If
    End If
    End If
   Application.StatusBar = i
    If i = n Then MsgBox ("успешно всталено " & i & "строк")
 Next i
 Application.ScreenUpdating = True
 Application.StatusBar = False
 End Sub
Изменено: olege1983 - 13.03.2024 11:06:08
Vba оставляет только целую часть числа, Vba вместо десятичной дроби взятой из ячейки в другую ячейку вставляет только ее целую часть
 
Почему при в ячейке вместо десятичной дроби появляется ее округленное число:
Например на листе 1 в столбце D записаны числа: 1,8 2,4 3,2 5,9
В итоговый столбец вместо чисел выше заносятся 2 2 3 6.
Т.е. как видно vba отбросил запятую и все что за ней предварительно округлив значение
Хотя Length имеет тип integer, значение Range("M" & I) становится целочисленным.
Код
Sub Длина_ВЛ()
Application.ScreenUpdating = False
Dim S As Variant, Length As Integer, Ei As String, Poz As Long
Dim Np As Long, Kp As Long
Np = Range("I15").Row
Kp = Range("I15").End(xlDown).Row - 1
For i = Np To Kp
Application.StatusBar = "Строка" & i & " из " & Kp
Set S = Worksheets("Лист1").Range("C:C").Find(Range("BM" & i), , xlValues, xlWhole, xlByRows)
Ei = Range("L" & i)
If Not S Is Nothing And Ei = "км" Then
Poz = WorksheetFunction.Match(S, Worksheets("Лист1").Range("C:C"), 0)
Length = Worksheets("Лист1").Range("D" & Poz)
Range("M" & i) = Leng
End If
Next i
Application.StatusBar = False
Application.ScreenUpdating = True
End Sub
Не находит значение в заданном диапазоне (subscript out of range)
 
Код должен найти позицию "ТР" в заданном диапазоне на строке i.
Конечный диапазон определяется верно, значения T1  и T2 тоже верно, но ставя точку останова определил, что в строке Set TR0 = Range(Cells(i, T1), Cells(i, T2)).Find("ТР", , xlValue, xlWhole, xlByColumns) возникает ошибка subscript out of range.  Если в начале кода поставить исключение проверки ошибок, то Tr1 будет равен empty.
Код
Sub ТО_ТР_смещ()
Application.ScreenUpdating = False
Dim TR1 As Long, TR0
For i = Range("I14").Row To Range("I15").End(xlDown).Row
'Set TR0 = Nothing
Set TR0 = Range(Cells(i, "T"), Cells(i, "AC")).Find("ТР", , xlValue, xlWhole, xlByColumns)
If Not TR0 Is Nothing Then
TR1 = WorksheetFunction.Match("ТР", Range(Cells(i, "T"), Cells(i, "AC")), 0)
End If
Next
End Sub
Изменено: olege1983 - 06.03.2024 10:30:55
Как объединить проверку на ноль и на пустую ячейку в одно условие
 
В коде ниже если Pob = notning (объект не найден) выходит ошибка
Run time error 91 Object variable or With block variable not set

в строке If Pob <> 0 And Not Pob Is Nothing Then
Если в строке If Pob <> 0 And Not Pob Is Nothing Then убрать Pob <> 0 And - ошибки выше не возникает, но в этом случае если встретится условие Pob = 0
выходит ошибка:

Run-time error 424: Object required

Код
Sub Яч_б_ТО()
Application.ScreenUpdating = False
Dim Pob, Diap As Range
Dim T
Dim P As Long, K As Long
Worksheets("ТО ВЛ-6кВ, КТПН,ЛР 2024").Activate
Pob = 0
For i = 1096 To 1453
Application.StatusBar = i
T = Cells(i, "G")
Set Diap = Range(Cells(i, "D"), Cells(i, "AF"))
Pob = 0
If Cells(i, "BQ") = 0 Then
Set Pob = Worksheets("ТО ПС-35 2024").Range("D10:D1000").Find(T, , xlValues, xlWhole, xlByRows)
End If
If Not Pob Is Nothing Then
K = WorksheetFunction.CountIf(Worksheets("ТО ПС-35 2024").Range("D10:D1000"), T)
P = WorksheetFunction.Match(T, Worksheets("ТО ПС-35 2024").Range("D1:D1000"), 0) + K
Worksheets("ТО ПС-35 2024").Range(P & ":" & P).Insert
Diap.Copy
Worksheets("ТО ПС-35 2024").Cells(P, "A").PasteSpecial
Diap.Interior.Color = RGB(240, 230, 185)
End If
Next
Application.StatusBar = False
Application.ScreenUpdating = True
End Sub
Изменено: olege1983 - 05.03.2024 13:36:48
Глюк в VBA Excel, Выдается ошибка 1004 Application defined or Object Defined Error
 
Программа должная в столбец J каждой строки таблицы вставить связку: номер ячейки (берется из столбца I, если столбец G начинается с "Ф-", то номер ячейки - число после "Ф-") и наименование подстанции.

Код доходит до обработки 29 строки и происходит вылет с ошибкой 1004,
но если значение i  поменять на : For i = 29 to 29 то код отрабатывает как надо, а если поставить например For i =28 to 29, то 28 -строка обработается ,а вот на 29 снова произойдет сбой. Почему так происходит, ведь значение i принимается в соответствии с циклом?
Код
Sub МВ()
Dim Yach As Long
Dim Ps
Dim A As Long
Dim tYach As Boolean
Dim b
Dim P As Range
Application.ScreenUpdating = False
For i = 12 To 60
Application.StatusBar = i
On Error Resume Next
Ps = WorksheetFunction.Search(" ", Cells(i, "I"), WorksheetFunction.Search("яч.№", Cells(i, "I")))
On Error GoTo 0
If IsEmpty(Ps) = True Then Ps = 0
If Ps = 0 Then
A = Len(Cells(i, "I")) - WorksheetFunction.Search("№", Cells(i, "I"))
Else
A = WorksheetFunction.Search(" ", Cells(i, "I"), WorksheetFunction.Search("№", Cells(i, "I"))) - _
WorksheetFunction.Search("№", Cells(i, "I")) - 1
End If
b = WorksheetFunction.Search("№", Cells(i, "I"))
If Left(Cells(i, "H"), 2) = "Ф-" Then
Cells(i, "J") = WorksheetFunction.Substitute(Cells(i, "H"), "Ф-", "") & " " & Cells(i, "G")
Else
Yach = Mid(Cells(i, "I"), b + 1, A)
Cells(i, "J") = Yach & " " & Cells(i, "G")
End If
Next i
Application.ScreenUpdating = True
Application.StatusBar = False
End Sub
Изменено: olege1983 - 04.03.2024 12:13:46
Не работает код в условиях массива, Выдается ошибка Type mismath
 
Код ниже не работает. Выделяется знак равно в 9 строке и выскакивает ошибка Type mismatch. Если в этой строке указать в nai номер элемента, то ошибка не возникает, но код в этом случае работает не так как задумано. А задумка: если в заданной ячейке значение будет равно одному из элементов массива, то код выполняется.
Код
Sub Переместить()
Dim Nai() As Variant, Poisk As Long, Np As Long
Application.ScreenUpdating = False
Np = Range("R:R").Column - 1
Nai = Array("ВЛ-6кВ Ф-14 ПС-35/6кВ К-1384", "ВЛ-6кВ Ф-6 ПС-35/6кВ К-1384", "ВЛ-6кВ Ф-9 ПС-35/6кВ К-1384", _
"ВЛ-6кВ Ф-4 ПС-35/6кВ К-330")
For i = 15 To 1500
Application.StatusBar = "строка " & i
If Cells(i, "BM") = Nai Then
Poisk = WorksheetFunction.Match("*", Range(Cells(i, "R"), Cells(i, "AC")), 0)
Cells(i, Np + Poisk).Copy
Cells(i, "Z").PasteSpecial
Cells(i, "Z").Interior.Color = vbRed
Cells(i, Np + Poisk).Clear
End If
Next i
Application.StatusBar = False
Application.ScreenUpdating = True
End Sub
RaiseEvent не работает
 
Скопировал на просторах интернета код, который симулирует вставку курсора в поле ввода в Internet Explorer.
Код
Sub Макрос4()
Dim ie As New InternetExplorer
ie.Visible = True 'чтобы отображать интерфейс браузера
ie.Navigate ("http://mysite")
Do While ie.ReadyState <> READYSTATE_COMPLETE
DoEvents
Loop
'Получаем элемент поля для ввода по его ID
Dim SearchBox As htmlinputelement
Set SearchBox = ie.document.getelementbyid("mx3307")
SearchBox.Focus
SearchBox.Click
Dim i As Integer
For i = 1 To Len(SearchBox.Value)
'симулируем нажатие клавиши в поле для ввода
raiseevent
ie.document.createevent("keyboardevent").initevent("keydown",true,true)
'симулируем отпускание клавиши в поле для ввода
raiseevent
ie.document.createevent("keyboardevent").initevent("keyup",true,true)
Next i
End Sub

строки : "raiseevent
ie.document.createevent("keyboardevent").initevent("keydown",true,true)
'симулируем отпускание клавиши в поле для ввода
raiseevent
ie.document.createevent("keyboardevent").initevent("keyup",true,true)"  выделяет красным
и как только введешь слово Raiseevent сразу выскакивает ошибка:
Compile error: Only valid in Object module.
Никак не могу понять что не нравится Excel-ю?
Изменено: olege1983 - 12.12.2023 13:26:27
Подставить в ячейку формулу суммы
 
В макросе определяется адрес начала диапазона a  и конец диапазона b. И в текущую ячейку ставится формула вида = СУММ(A1:A3).
Если ввести ту же формулу в VBA без "=, то считает, но в ячейке появляется только результат. Vba выдает ошибку "line number or label or statement..." и выделяет " & b)"
Код
Sub Тест()
Dim a As Long
Dim b As Long
Dim a1
Dim b1
Dim c
a = ActiveCell.Row - 2
b = ActiveCell.Row - 1
a1 = Cells(a, 1).Address
b1 = Cells(b, 1).Address
ActiveCell.Formula = "Sum(a1 & ":" & b1)"
End Sub
Изменено: olege1983 - 27.11.2023 10:01:39
Функция match ищет не то значение
 
Есть файл, в нем необходимо  МВ, ВВ. СМВ в ячейке средствами макроса (находится на листе) указать порядковый номер и если в  списке существует ТТ такого же номера ячейки, то присвоить такой же номер, номера не должны повторяться.
Код в целом выполняется верно, но загвоздка в строке 9, почему то ТТ находит он в строке 12, хотя должен в строке 11
Код
Sub Сопоставл_ТТ()
On Error Resume Next
Application.ScreenUpdating = False
Dim A As Long, B As String, C As String, D As Long, E As String
Dim C1 As String, C2 As String, C3 As String, C4 As String
Dim TTV As String
Dim C11 As Long, C21 As Long, C31 As Long
Dim f As Long, g As Integer, i As Long, h As Long
Dim k As Long, k1 As Long
Dim M As Long
Dim q As Range
Dim TTL As Long
Dim KL
M = 3
k1 = ActiveCell.Row
f = ActiveCell.Column
A = WorksheetFunction.Match("Источник, присоединение", Range(Cells(1, 1), Cells(1, 40)), 0)
For k = k1 To k1 + M
TTL = 0
    If Cells(k, f) <> 0 And WorksheetFunction.Search("РУ", Cells(k, f - (f - A + 1))) Then
     Cells(k, f) = Cells(k, f)
    Else
    'f = ActiveCell.Column
    'If k = 0 Then g = ActiveCell.Row Else g = ActiveCell.Row + 1
    'If Cells(g, f) = 0 Then
        Set q = Cells(k, f - (f - A + 1))
            C1 = Left(q.Value, WorksheetFunction.Search("--", q.Value) - 1)
        C11 = Len(C1)
        prov = WorksheetFunction.Search("--", q, _
            WorksheetFunction.Search("--", q) + 1)
        C2 = Mid(q, C11 + 3, WorksheetFunction.Search("--", q, _
            WorksheetFunction.Search("--", q) + 1) - WorksheetFunction.Search("--", q) - 2)
        C21 = Len(C2)
        C31 = Len(q) - C21 - C11 - 4
        C3 = Mid(q, C11 + C21 + 5, C31)
        C = Left(C3, 5)
        If Left(C, 4) = "МВ-6" Or Left(C, 4) = "ВВ-6" Or _
            Left(C, 5) = "СВВ-6" Or Left(C, 5) = "СМВ-6" Then
            B = "ТТ-6кВ"
            D = WorksheetFunction.Search(" ", C3, WorksheetFunction.Search _
                (" ", C3) + 1)
               ' KL = WorksheetFunction.Search("яч", C3)
            If D > 0 Then _
                C4 = Mid(C3, WorksheetFunction.Search("яч", C3) + 4, WorksheetFunction.Search(" ", _
                C3, WorksheetFunction.Search("яч", C3)) - WorksheetFunction.Search("яч", C3) - 4) _
            Else C4 = Mid(C3, WorksheetFunction.Search("яч", C3) + 4, Len(C3) - _
                WorksheetFunction.Search("яч", C3) - 3)
            TTV = C1 & "--" & C2 & "--ТТ-6кВ яч.№" & C4
            TTL = WorksheetFunction.Match(TTV, Range(Cells(1, f - (f - A + 1)), _
                Cells(4300, f - (f - A + 1))), 0)
            If D > 0 Then E = Left(B, D - 1) Else E = B
            Cells(k, ActiveCell.Column) = WorksheetFunction.Max _
            (Range(Cells(16, f), Cells(k1 + M, f))) + 1
            Cells(TTL, f) = Cells(k, f)
            Cells(k, f).Interior.Color = vbGreen
            Cells(TTL, f).Interior.Color = vbGreen
             Else
        Cells(k, f) = Cells(k, f)
         End If
    End If
    Application.StatusBar = "выполнено " & Round(k * 100 / M, 0) & " %"
Next
Application.StatusBar = False
Application.ScreenUpdating = True
End Sub

Конечное значение C3 не содержит второго пробела, но D вместо 0 принимает значение 13 и C4 вместо значения 10 принимается как 2.

В чем глюк?
Изменено: olege1983 - 02.11.2023 15:43:37 (неверное расположение диапазона)
Не дает добавить элемент Toolbox в форму
 
Беру мышкой элемент label, несу его на форму, выделяю область и тут выскакивает такое:
"Имя задано неоднозначно"
Копирую элемент типа Label , и при вставке выдает:
"Could not paste the control. Имя задано неоднозначно". Т.е VBA в принципе не дает создать элемент формы.
Закрытие и открытие файла, перезагрузка ПК не помогает.
Понимаю что по какой-то причине excel не присваивает следующий порядковый номер, но не могу понять причину.
Копировать из label
 
Как скопировать значение в буфер обмена из label в пользовательской форме?
Код ниже выдает ошибку на 4 строке: Object doesn't support this property or method, хотя CAkt1 принимает значение Label1
Код
Private Sub CommandButton3_Click()
Dim CA As New DataObject, CAkt1 As String
CAkt1 = label1.Caption
CA.SelText (CAkt1)
CA.PutInClipboard
End Sub
vba не видит открытое окно браузера firefox
 
с открытым браузером Internet Explorer проблем не возникает, код работает исправно. Но если поменять значение переменной myinternetexplorer.name с internet explorer на mozilla firefox, то код перестает работать и ничего не происходит, хотя браузер firefox открыт.

вопрос почему excel ie видит, а firefox нет?
Код
Sub Sogl()
On Error Resume Next
Dim ObjTag As Object
Dim ohtm As Object
Dim Sa As Variant
Dim Sa2 As Variant
Dim myShell As Object
   Dim myInternetExplorer As Object
    Set myShell = CreateObject(class:="Shell.Application")
       For Each myInternetExplorer In myShell.Windows
              'If myInternetExplorer.Name = "Internet Explorer" Then
              If myInternetExplorer.Name = "Mozilla Firefox" Then
              MsgBox ("MZ")
            Exit For
      End If
    Next myInternetExplorer
    If myInternetExplorer Is Nothing Then
    Exit Sub
   End If
   Dim i
   Dim s As Integer
   s = Application.InputBox("êîëè÷åñòâî ïîçèöèé", , , , , , , 1)
   For i = 1 To s
For Each ObjTag In myInternetExplorer.document.getElementsByTagName("Input")
If InStr(ObjTag.outerhtml, "fld text   fld fld_ro") > 0 Then
Sa2 = ObjTag.ID
Sa2 = Application.WorksheetFunction.Substitute(Sa2, "mx", "")
Sa2 = Sa2 + 716
Exit For
End If
Next
myInternetExplorer.document.getElementbyId("mx" & Sa2).Click
Application.Wait Time:=Now + TimeValue("0:00:6")
For Each ObjTag In myInternetExplorer.document.getElementbyId("dialogholder").getElementsByTagName("Button")
If InStr(ObjTag.outerhtml, "text pb") > 0 Then
Sa = ObjTag.ID
Exit For
End If
Next
myInternetExplorer.document.getElementbyId(Sa).Click
Application.Wait Time:=Now + TimeValue("0:00:6")
myInternetExplorer.document.getElementbyId("mx426_anchor").Click
Application.Wait Time:=Now + TimeValue("0:00:6")
Next
End Sub
Мистическое удаление содержимого после выполнения кода
 
[CODE][/CODE]
Изменено: olege1983 - 15.02.2023 21:53:33
При использовании Union вываливается ошибка
 
При исследовании application.union вываливается ошибка invalid procedure call or argument.
Пробовал устанавливать On error resume next - код выполняется, но строку application.union пропускает. этой строкой я объединяю диапазоны и выделяю (аналогично удерживанию клавиши ctrl).
Или подскажите как выделить несмежные диапазоны зная номера строк и столбцов. Метод range("a1:a10,c1:c10") не подходит, т.к. положение столбцов на листе не фиксированное . Иначе пользователь может добавить столбец и макрос перестанет правильно работать.
Range("cells(1,5):cells(20,5)") , вываливает ошибку method Range of object global failed.
Range([cells(1,5):cells(20,5)]) - 1004 компонент с указанным именем не найден.
Код
Sub CopyResultFile2()
Sheets("график").Select
Dim Aktiv, NameAktiv, VidRem, PlanData, NomRZ, FaktData, Status
Dim DAktiv As Range, DNameAktiv As Range, DVidrem As Range, DPlandata As Range, 
DFaktdata As Range, DNomrz As Range, DStatus As Range, Dv As Range
Aktiv = WorksheetFunction.Match("Номер акт", Range(Cells(12, 1), Cells(12, 100)), 0)
NameAktiv = WorksheetFunction.Match("Наименование акт", Range(Cells(12, 1), Cells(12, 100)), 0)
VidRem = WorksheetFunction.Match("Вид рем", Range(Cells(12, 1), Cells(12, 100)), 0)
PlanData = WorksheetFunction.Match("Дата план", Range(Cells(12, 1), Cells(12, 100)), 0)
NomRZ = WorksheetFunction.Match("рабочее задание" _
, Range(Cells(12, 1), Cells(12, 100)), 0)
FaktData = WorksheetFunction.Match("Дата выполн/отказа", Range(Cells(12, 1), Cells(12, 100)), 0)
Status = WorksheetFunction.Match("Выполнение", Range(Cells(12, 1), Cells(12, 100)), 0)MsgBox (Aktiv & vbCr & NameAktiv & vbCr & VidRem & vbCr & PlanData & vbCr & NomRZ & vbCr & _
FaktData & vbCr & Status)Set DAktiv = Application.Range(Cells(14, Aktiv), Cells(89, Aktiv))
Set DNameAktiv = Application.Range(Cells(14, NameAktiv), Cells(89, NameAktiv))Set DVidrem = Application.Range(Cells(14, VidRem), Cells(89, VidRem))
Set DPlandatas = Application.Range(Cells(14, PlanData), Cells(89, PlanData))
Set DNomrz = Application.Range(Cells(14, NomRZ), Cells(89, NomRZ))
Set DFaktdata = Application.Range(Cells(14, FaktData), Cells(89, FaktData))
Set DStatus = Application.Range(Cells(14, Status), Cells(89, Status))
Set Dv = Application.Union(DAktiv, DNameAktiv, DVidrem, DPlandata, DNomrz, DFaktdata, DStatus).Select
Selection.Copy
End sub
Изменено: olege1983 - 14.02.2023 12:50:34
Не появляется пункт в контектстном меню
 
Создал, маркос, форму и функцию вызывающую этот макрос через правую кнопку мыши.
Если все это находится в конкретной книге то все работает.
Для того чтобы применять макросы в других книгах создал настройку, поместил все макросы. Надстройку подключил, но при нажатии правой кнопкой мыши пункт меню не появляется  
Строка кода выделяется красным
 
Следующий код вторая строка выделяется красным. Появляется ошибка expected:Lib.
Office 2010. ОС windows 7 32bit.
Код скопировал на просторах интернета и вроде должен работать универсально на всех версиях excel.
На одном сайте советуют игнорировать красную строку, но при вызове других макросов в этой книге выбивает на этот модуль (excel не хочет игнорировать красную строку).
Код
#If VBA7 Then
Declare Function PtrSafe LoadKeyboardLayout Lib "User32" Alias "LoadKeyboardLaoutA" (ByVal pwszKLID As String, ByVal flags As LongPtr) As LongPtr
#Else
Declare Function LoadKeyboardLayout Lib "User32" Alias "LoadKeyboardLaoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long
#End If

При объявлении переменных вместо номеров строк возникает ошибка
 
Возникает ошибка Error13 type mismatch в последней строке перед end sub. Пробовал разные типы данных не помогает. А если тип данных для add и add2 установить Range,  то возникает ошибка 91. При том что при отладке при наведении на add и add2 во всплывающем уведомление показывает эти номера строк.
Код
Option Explicit
Private Sub CommandButton1_Click()
Dim FIO As String
Dim Akt
Dim add, add2
Dim TekPoz
FIO = Fam & " " & Imya & " " & otch
TekPoz = ActiveCell.Cells(1, 1)
Akt = MsgBox("активируйте ячейку, перед которой" _
& vbCr & "необходимо вставить данные", vbOKOnly, "Акктивируйте ячейку с ФИО")
add = ActiveCell.Row
add = add + 0
add2 = add + 1
Rows("add:add2").Select
End Sub

​если вместо:

Код
rows("add:add2").select 

прописать конкретно номера строк, например:

Код
rows("34:35"). select

, то ошибка не появляется и выделятся строки 34 и 35

Изменено: olege1983 - 07.02.2023 07:40:57
не запускается макрос
 
создал макрос, а он не запускается через alt+f8Особенность: на всех макросах все кнопки активны кроме "создать", а на этом наоборот активна только кнопка создать.
 
Страницы: 1 2 След.
Наверх