Sanja, спасибо разобрался. Нет в ячейке А1 найдет значение. Дело в том, что оказывается VBA и Excel по разному воспринимают дату. В русской версии Excel названия месяцев пишутся по русски Январь, Февраль а вот VBA понимает только английский язык: January, February
Код
Sub Дата()
Dim a As Range
Range("A1") = DateSerial(2025, 1, 1)
Set a = Range("A1").Find("January", , xlValues, xlPart)
If a Is Nothing ThenDebug.Print ("значение не найдено")
Else
Debug.Print ("Январь")
End If
End Sub
В ячейке 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
Да речь про этот код. Спасибо за подсказку. А логика: код должен скопировать данные из изменённого графика и заменить их в основном годовом графике, должен попасть точно в заданный диапазон дат. мне вот интересно как VBA не находит если визуально видно что в одной ячейке 31.03.2025 и в другой также.
Уточнение ошибка при работе кнопки: код: Если запустить нажав на кнопку Сохранить изменения- ошибка связанная с match, если же код связанный с кнопкой запустить из окна VBA - ошибка та что в начале.
Код ниже выдаёт ошибку: Run-time error 1004. Application-defined or object-defined error. Ошибка возникает только в одной книге. В новой и других - код работает нормально. Ошибка везде неважно какая ячейка или лист.
Sanja, вот формула из ячейки она рабочая и я хотел по подобию сделать в vba: =ЕСЛИ(ЛЕВСИМВ(E7;2)<>"Ф-";ЕСЛИ(И(ЕОШ(ПОИСК("яч";H7))=ЛОЖЬ;ИЛИ(СВВ";M7="СМВ"));D7&" Ф-"&ПСТР(H7;ПОИСК("яч";H7)+4;ЕСЛИ(ЕОШ(ПОИСК(" ";H7;ПОИСК("яч";H7)+1))=ЛОЖЬ;ДЛСТР(H7)-ПОИСК(" ";H7;ПОИСК("яч";H7)+3)-1;ДЛСТР(H7)-(ПОИСК("яч";H7)+3)));"Оборудование");D7&" "&E7)
Sanja, к сожалению файл не могу прикрепить. Смысл такой: в ячейке есть текст, где присутствует яч.XX, вот XX-это число, которое выявляется с помощью функции mid. все было бы хорошо если б число было последними символами, но в некоторых ячейках яч.ХХ находится в середине текста. Т.е. необходимо определить номер ячейки в тексте независимо от его положения в этом тексте. Номер ячейки может быть как однозначным так и двухзначным.
Два дня не могу понять в чем ошибка, вроде все скобки верно расставлены, а VBA неугомонный выдает ошибку Compile error, explected и выделяет ifisserr. Данное содержание работает если вписать его в ячейку в качестве формулы, но почему то не работает в 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
Есть код, при котором на лист дата выводится неверно. Код укорочен для понимания.
Код
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.
Необходимо чтобы можно было обращаться к элементам формы не только по их имени, а еще и через вычисленные значения к переменных.Пример кода:
Код
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
Надстройка должна добавлять пункт в контекстное меню. Но пункт не появляется. Функция работает если только код ниже поместить в модуль книги: Да и если заменить 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
Хочу добавить свой пункт в контекстное меню. Нашел код, но ничего кроме стандартных пунктов нет
Код
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
вот так, заработало, но почему макрорекордерная версия не работает. Забыл сказать, что я изменил начало кода: Макрорекордер выдал Activeworkbook.Names и вот эту фразу я изменил на Worksheets
Код
Sub Добавить_имена()
Worksheets("График").Names.Add Name:="namecount", RefersToR1C1:=Range("CJ15:CJ4200")
Worksheets("График").Names.Add Name:="namecount2", RefersToR1C1:=Range("CM15:CM4200")
Worksheets("График").Names.Add Name:="namecount3", RefersToR1C1:=Range("CS15:CS4200")
Worksheets("График").Names.Add Name:="namecount4", RefersToR1C1:=Range("BP15:BP4200")
Worksheets("График").Names.Add Name:="namelist", RefersToR1C1:=Range("CJ15:CK4200")
Worksheets("График").Names.Add Name:="namelist2", RefersToR1C1:=Range("CM15:CM4200")
Worksheets("График").Names.Add Name:="namelist3", RefersToR1C1:=Range("CS15:CT4200")
Worksheets("График").Names.Add Name:="namelist4", RefersToR1C1:=Range("BP15:CBQ4200")
End Sub
Хочу создать макрос для создания группы именованных диапазонов. Но возникает проблема, сразу при запуске выскакивает ошибка. Если убрать знаки $ то именованные диапазоны благополучно создаются, но не работают, ячейки которые ссылаются на них получают ошибку ИМЯ. В списке имен почему-то ячейки подсвечены одинарными кавычками =График!'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
Дмитрий(The_Prist) Щербаков, Спасибо попробую. В ячейках, позицию которую хочу найти на самом деле написано куда больше букв, например "Присоединение силового трансформатора".
Никак не пойму почему в строке "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
добавил пробел после точки. С виду работает, но как только доходит до трехзначных чисел происходит нечто странное, строки 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) начинает работать неправильно, когда цвет ячеек не равен друг другу, но ексель думает что они равны и принимает значение False., таким образом вместо 100. 1 выводит .1
Почему код ниже преобразует текстовое значение в числовое:
код ниже выводит
Должен выводить
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-ом случае подсчет идет неверный, программа почему-то учитывает ячейки с нулевой длиной (в первом случае она не считала эти ячейки). Если ради эксперимента очистить пустые ячейки, то формулы начинают считать верно. Но в тех ячейках формула.
Код вроде работает как бы правильно, но не правильно: он вставляет формулы не из ячейки ниже а из ячейки выше, причем не имеет значения 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
Почему при в ячейке вместо десятичной дроби появляется ее округленное число: Например на листе 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