Недавно попытался написать код обновления базы данных Access (accdb) данными из Excel макросом, который находится в Excel (примеры во вложенных файлах). Но при выполнении появляется ошибка Run-time error '3704':Операция не допускается, если объект закрыт. Пробовал добавить SET NOCOUNT ON в SQL-запрос, но получил ошибку синтаксиса SQL. Как исправить ошибку 3704? Правильные ли я подключил библиотеки: Microsoft Access 15.0 Object Libray Microsoft ActiveX Data Objects 2.8 Library Microsoft ActiveX Data Objects Recordset 6.0 Library?
Правильный ли выбрал Provider=Microsoft.ACE.OLEDB.12.0? OC - Windows 7 SP 1 64-bit, Office - 2016. Подскажите, пожалуйста.
Вот код:
Код
Option Explicit
Dim EA As Excel.Application
Dim WB As Excel.Workbook
Dim WS As Excel.Worksheet
Dim strValue$, idcode&, strSQL$
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Public Sub transferAccPr()
Set EA = Excel.Application
EA.ScreenUpdating = False
EA.DisplayAlerts = False
EA.StatusBar = False
Set EA = Excel.Application
Set WB = EA.Workbooks("TestExcel.xlsm")
Set WS = WB.Worksheets("Лист1")
Set cn = New ADODB.Connection
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\TestAccessBD.accdb;"
cn.Open
strValue = WS.Cells(2, 2).Value
idcode = WS.Cells(2, 1).Value
'strSQL = "SET NOCOUNT ON UPDATE Products SET [Item] = " & " '" & strValue & "'" & " WHERE Products.[CodeId]= 4"
strSQL = "UPDATE Products SET [Item] = " & " '" & strValue & "'" & " WHERE Products.[CodeId]= 4"
Set rs = cn.Execute(strSQL)
rs.Close
cn.Close
EA.ScreenUpdating = True
EA.DisplayAlerts = True
End Sub
Привет, всем. Как заменить любое выражение внутри скобок? В ячейке A1 выражение со скобками "апельсин (мандарин мандарин)", нужно получить "апельсин" (пример во вложенном файле). Попробовал два метода. Ни один не работает. Как правильно? Подскажите, пожалуйста. Код:
Код
Option Explicit
Dim WEA As Excel.Application
Dim WB As Excel.Workbook
Dim WS As Excel.Worksheet
Dim strValue$(1 To 10)
Dim nRegExp As RegExp
Public Sub replaceValue()
Set WEA = Excel.Application
WEA.ScreenUpdating = False
WEA.DisplayAlerts = False
WEA.StatusBar = False
Set WEA = Excel.Application
Set WB = WEA.Workbooks("Замен внутри скобок.xlsm")
Set WS = WB.Worksheets(1)
Set nRegExp = New RegExp
With WS
strValue(1) = .Cells(1, 1).Value
strValue(3) = Replace(strValue(1), "(*)", "")
nRegExp.Pattern = "(w\*)"
strValue(2) = nRegExp.Replace(strValue(1), "")
End With
WEA.ScreenUpdating = True
WEA.DisplayAlerts = True
End Sub
Привет, всем Как узнать длину массива, если он задан через функцию Array (пример во вложенном файле)? Строка i = arrTest.Ubound выдает ошибку. Подскажите, пожалуйста. Код:
Код
Dim WEA As Excel.Application
Dim WB As Excel.Workbook
Dim WS As Excel.Worksheet
Dim arrTest
Public Sub replaceValue()
Set WEA = Excel.Application
WEA.ScreenUpdating = False
WEA.DisplayAlerts = False
WEA.StatusBar = False
Set WEA = Excel.Application
Set WB = WEA.Workbooks("Длина массива.xlsm")
Set WS = WB.Worksheets(1)
arrTest = Array(1, 2, 3, 43, 5)
'i = arrTest.Ubound
WEA.ScreenUpdating = True
WEA.DisplayAlerts = True
End Sub
Привет, всем Есть строка, где регулярное выражение должно найти дату вида "01.07.2015" и присвоить переменной strDate. Но strDate остается "Empty". В чем может быть причина? Подскажите, пожалуйста. Пример во вложенном файле. Код:
Код
Dim WEA As Excel.Application
Dim WB As Excel.Workbook
Dim WS As Excel.Worksheet
Dim WSR As Range
Dim regDate As RegExp
Dim srtDate
Public Sub regExpProcedure()
Set WEA = Excel.Application
WEA.ScreenUpdating = False
WEA.DisplayAlerts = False
Set WEA = Excel.Application
Set WB = WEA.Workbooks("Ðåãóëÿðíîå âûðàæåíèå.xlsm")
Set WS = WB.Worksheets(1)
Set regDate = New RegExp
With WS
For Each WSR In Range(.Cells(1, 1), .Cells(1, 4))
If WSR.Value Like regDate.Pattern = ("\w{2}.\w{2}.\w{4}") Then strDate = WSR.Value
Next WSR
End With
WEA.ScreenUpdating = True
WEA.DisplayAlerts = True
End Sub
Привет, всем. Как заполнить двухмерный динамичный массив? Пишет ошибку ("Run-time error'9' Subscript out of range") в строке ReDim Preserve ARR_Extract(1 To n, 1 To i). Пример во вложенном файле. Подскажите, пожалуйста.
Код
Option Explicit
Option Base 1
Dim WEA As Excel.Application
Dim WB(1 To 30) As Excel.Workbook
Dim WS(1 To 30) As Excel.Worksheet
Dim i&, y&, n&, k&
Dim iLastRow&(1 To 30)
Dim iLastColumn&(1 To 30)
Public Sub test_Procedure()
Set WEA = Excel.Application
WEA.ScreenUpdating = False
WEA.DisplayAlerts = False
Set WEA = Excel.Application
Set WB(1) = WEA.Workbooks("Двухмерный динамичный массив.xlsm")
Set WS(1) = WB(1).Worksheets(1)
iLastRow(1) = LastRow_FA(WS(1), 1)
iLastColumn(1) = LastColumn_FA(WS(1), 1)
For n = 1 To iLastRow(1)
For i = 1 To iLastColumn(1)
ReDim Preserve ARR_Extract(1 To n, 1 To i)
ARR_Extract(n, i) = WS(1).Cells(n, i).Value
Next i
Next n
WEA.ScreenUpdating = True
WEA.DisplayAlerts = True
End Sub
Private Function LastColumn_FA(WSF As Excel.Worksheet, ifun&)
With WSF
LastColumn_FA = .Cells(ifun, .Columns.Count).End(xlToLeft).Column
End With
End Function
Private Function LastRow_FA(WSF As Excel.Worksheet, ifun&)
With WSF
LastRow_FA = .Cells(.Rows.Count, ifun).End(xlUp).Row
End With
End Function
Привет, всем Есть два диапазона A1:B5 и F1:G12 с названиями столбцов "Код" и "Категория" (пример во вложенном файле). Как в первый диапазон вернуть все соответствующие значения из второго диапазона из столбца "Категория" через формулу массива с использованием разделителя "/"? Чтобы, к примеру, в ячейке B2 было значение "A/C"? Я попробовал использовать формулу: {=ЕСЛИ(A2:A5=F2:F12;G2:G12)&"/"}, но она возвращает ЛОЖЬ/ для всего диапазона. Макросы и UDF не подойдут.
Часто ее вижу, но не могу найти нормального объяснения. Что она значит? Причем VBE подчеркивает ее красным, а сами файлы .cls открываются у меня не как модули классов, а как обычные модули .bas. Приходится создавать отдельные модули и просто туда копировать код. С чем это связано? Настройки в VBE не те стоят? Подскажите, пожалуйста.
Привет, всем. Есть диапазон с датами звонков. Можно ли подсчитать одной формулой количество звонков за два несвязанных между собой промежутка времени (например, с 1.01.16 по 4.01.16 и с 20.01.16 по 31.01.16). Я попробовал сделать это с помощью формулы: =СЧЁТЕСЛИ(A2:A38;ИЛИ("<4.01.16";">19.01.16")) , которая явно неправильная. Можно, конечно, два раза ввести формулу СЧЁТЕСЛИ: =СЧЁТЕСЛИ(A2:A38;"<4.01.16")+СЧЁТЕСЛИ(A2:A38;">19.01.16"). Но можно ли это сделать одной формулой через ИЛИ? Пример во вложенном файле.
Привет, всем. Я попытался сделать создание диаграммы с помощью макроса и получил такой код (пример во вложенном файле Module 3):
Код
Dim WE As Excel.Workbook
Dim WS As Excel.Worksheet
Dim r1 As Range
Dim r2 As Range
Dim myMultiAreaRange As Range
Sub Proverka()
Set WE = Application.Workbooks("Диаграмма.xlsb")
Set WS = WE.Worksheets("Лист1")
With WS
Set r1 = .Range(.Cells(1, 1), .Cells(13, 2))
Set r2 = .Range(.Cells(1, 4), .Cells(13, 4))
Set myMultiAreaRange = Union(r1, r2)
myMultiAreaRange.Select
.Shapes.AddChart.Select
ActiveChart.ChartType = xlLine
ActiveChart.SetSourceData myMultiAreaRange
End With
End Sub
Но в строке .Shapes.AddChart.Select возникает 1004 ошибка.
Попробовал сделать тоже самое с помощью макрорекодера, но в результате VBA не смог запустить свой же код с такой же ошибкой в строке ActiveSheet.Shapes.AddChart.Select (Module 4).
Привет, всем. Как выделить несвязанный диапазон в VBA без использования стиля A1 (пример в прикрепленном файле)? Получилось вот, что:
Код
Public Sub Proverka()
Set WE = Application.Workbooks("Диапазон.xlsm")
Set WS = WE.Worksheets("Лист1")
With WS
.Range(.Cells(1, 1), .Cells(13, 2)).Select 'работает
'.Range("A1:B13,D1:D14").Select 'работает
'.Range(.Cells(1, 1), .Cells(13, 2), .Cells(1, 4), .Cells(13, 4)).Select 'не работает
End With
End Sub
Через A1 получается, а через обычную запись (для меня более удобную) - нет. Подскажите, пожалуйста.
Привет, всем Недавно решил попробовать MZ-Tools 3.0. Проблема в том, что панель программы отобразилась только для пользователя с правами администратора, а для пользователей с обычными правами ее нет. Смотрел справку - ничего не нашел. Подскажите, пожалуйста, как ее установить для всех пользователей?
Привет, всем В файле Тест.xlsm во вкладке "test" есть кнопка, при нажатии на которую должно появляться диалоговое окно сохранения файлов. После чего должен сохраняться первый лист файла в виде отдельной книги в определенную папку. Я попытался сделать это через Application.GetSaveAsFilename (для определения пути для сохранения), но появляется ошибка. Конечно, можно воспользоваться InputBox для определения пути к папке, но можно ли приспособить под эту задачу GetSaveAsFilename? Недостаток InputBox для меня в том, что нужно набирать путь файла в этом окне, а не выбирать папку непосредственно на диске.
Привет, всем. Есть простой макрос, меняющий цвет активной ячейки. Я поместил этот макрос в событие Worksheet_SelectionChange. Цвет ячейки меняется автоматически. Я также сделал надстройку в файле (test), меняющую цвет ячейки при нажатии. Чтобы настройка было доступна для любого листа, я поместил ее папку вместо Personal.xlsb Можно ли объединить эти два подхода, т.е., чтобы процедура в Worksheet_SelectionChange включалась только, если нажата кнопка в надстройке для любого активного листа (не только Тест.xlsm)? Т.е. вызвать событие Worksheet_SelectionChange через надстройку для ActiveSheet? Как следует изменить код? Вложенный файл - Тест.xlsm
Привет, всем. В файле "Пример словаря" создается словарь DictW. Ключ - английское слово, значение - русский перевод. Подскажите, пожалуйста, как из этого словаря извлечь случайную пару "Ключ - значение" и поместить его в строке 10? Можно, конечно, использовать значение ячеек, но меня интересует работа со словарем.
Привет, всем. В файле "Данные.xlsm" хранятся данные, с помощью которых формируется словарь. При этом ключ название магазина ("Магазин 1" и др.), а значения словаря массив из данных по продажам апельсинов, мандаринов и киви. В файл "Таблица.xlsm" мне удалось перенести ключи этого словаря. Но как перенести значения по продажам апельсинов, мандаринов и киви, соответственно , в столбцы 2,4,6? Подскажите, пожалуйста. Можно, конечно, просто приравнять значения ячеек в обоих файлах, но меня интересует работа именно со словарем. Код в файле "Таблица.xlsm"
Привет, всем! Есть лист с номенклатурой и значением продаж (первый лист "Сумма по нескольким критериям (4).xlsm" ). Как с помощью функции СУММПРОИЗВ или другой функции найти сумму значений с проверкой условия на другом листе (условие "да", второй лист)? У меня получилась следующая формула:
С помощью формулы "СУММАЕСЛИМН" я подсчитал сумму с использованием двух условий (Магазин 1, <> манго, пример во вложенном файле). Можно ли в одном условии указать больше одного элемента? К примеру, не просто не равно манго, а не равно манго и ананасу (т.е. некоторому массиву данных). Вариант, просто дописать еще одно условие не подходит, т.к. у формулы есть ограничение в 127 условий и нужный массив будет создан с помощью макроса автоматически.
Привет, всем. Есть два файла: "Начальные данные.xlsb" и "Массив данных.xlsb" (пример во вложенном файле). Из файла "Начальные данные.xlsb" в макросе формируется словарь (Ключ - Номенклатура, Свойство - актуальность). Нужно, чтобы вся номенклатура со свойством равным "Нет" удалялась из файла " Массив данных.xlsb" (т.е. целиком удалялась строка). Я написал (целиком код в файле "Начальные данные.xlsb" ) следующие:
Код
For n = 2 To Lt(1)
oDict.Add Key:=WS(1).Cells(n, 1).Value, Item:=WS(2).Cells(n, 2).Value
For i = Lt(2) To 2 Step -1
If WS(2).Cells(i, 1).Value = oDict.Key(WS(1).Cells(n, 1).Value) & _
oDict.Item(WS(1).Cells(n, 1).Value) = "Нет" Then WS(2).Rows(i).Delete
Next i: Next n
В oDict.Key(WS(1).Cells(n, 1).Value) & oDict.Item(WS(1).Cells(n, 1).Value) = "Нет" появляется ошибка неправильного использования свойства. Подскажите, пожалуйста, как правильно оформить код.
Раньше в макросах я просто удалял строки через сравнения значений ячеек, т.е WS(2).Cells(i, 1).Value = WS(1).Cells(n, 1).Value, но решил попробывать использовать словари, т.к. они ускоряют работу кода.
Привет, всем Есть столбец с датами, а в соседнем столбце значения (пример во вложенном файле). Можно ли формулой (наподобие СУММАЕСЛИ), посчитать сумму по месяцам в третьем столбе?
Привет всем На листе есть ComboBox (пример во вложенном файле). Свойства LinkedCell (C9) и ListFillRange(A1:A5) заданы вручную. Как в макросе привязать их к переменным t и k? Чтобы с помощью макроса менялся диапазон данных и связанная ячейка (получилось C8 и A1:A25)? Подскажите, пожалуйста.
Привет, всем Как сформировать динамичный массив из названий отмеченных флажков на форме? Написал:
Код
Private Sub CommandButton1_Click()
y = 0
For Each Flag In Controls
If Flag.Value = True Then
nst(y) = Flag.Caption: y = y + 1
ReDim Preserve nst(y): Debug.Print nst(y)
End If
Next
End Sub
Но появляется ошибка №9 в строчке nst(y) = Flag.Caption: y = y + 1. Подскажите,пожалуйста, как правильно? Пример во вложенном файле.
Привет, всем Есть форма, на которой есть несколько элементов "Флажок" (пример во вложенном файле). При активации формы можно, конечно, задать состояние с помощью CheckBox.Value = 1 для каждого флажка. Но можно ли сделать все это с помощью цикла? Я попытался написать:
Код
For i = 1 To 5
CheckBox(i).Value = 1
Next i
В результате выдает ошибку. Подскажите, пожалуйста. Из Правил: 2.6. Один вопрос - одна тема. Не следует в открываемой теме обозначать и задавать сразу несколько вопросов. [МОДЕРАТОР]
Привет, всем. Есть некий файл ("Пример использования форматов.xlsb"). Как через код VBA сохранить его в формате xlam? Т.е какое значение должно быть у параметра FileFormat при сохранении книги через SaveAs? Если пользоваться макрорекодером, то при сохранении в формате xlsb появляется xlExcel12. А если сохранить в xlam, то рекодер ничего не отображает. Подскажите, пожалуйста.
Привет всем Как перенести макросы обработки события листа в другой файл?
Суть задачи такая. Есть готовый макрос обработки события листа (нумерованный список - взял из примеров на сайте, файл - Пример.xlsm). Нужно автоматически перенсти этот макрос на три листа другой книги (Проба работы с классами.xlsm). Я попытался перенсти с помощью создания нового модуля класса, но при выполении появляется 91 ошибка.
Подскажите, пожалуйста, как нужно подкорректировать код, чтобы все работало?
Привет, всем. Можно ли полностью закрыть файл, не закрывая при этом вызываемую им форму?
Форма UserForm1 ("Форма.xlsm") отрывает файл ("Файл.xlsm"). При закрытии этого файла (через BeforeClose) открывается другая форма UserForm2. Проблема в том, что пока UserForm2 не закрыта, файл продолжает быть открытым. Максимум, что мне удалось добиться - это свернуть окно "Файл.xlsm" на панель задач. Подскажите, пожалуйста, существует ли способ полностью закрыть файл при активной форме UserForm2? Либо сделать возможным редактирование файла не закрывая форму UserForm1 (если ее не скрыть файл нельзя редактировать, даже если активировать окно "Файл.xlsm")?
Привет всем Создал простенькую форму, которая открывает определенный файл. При этом путь до файла задается в отдельном окне. Как можно снова сразу активировать форму, при изменении и закрытии файла? Пример приложил.
Привет, всем :) Объясните, пожалуйста, в чем ошибка. Если с помощью макроса ввести формулу округления до ближайшего меньшего числа в виде WSP.Cells(2, 2).FormulaR1C1 = "=ROUNDDOWN(RC" & 1 & "/" & "3.5,0)" то она срабатывает А если чуть изменить на WSP.Cells(2, 2).FormulaR1C1 = "=ROUNDDOWN(RC" & 1 & "/" & 3.5 & ",0)", то выдает ошибку 1004.
Также если записать WSP.Cells(2, 2).FormulaR1C1 = "=ROUNDDOWN(RC" & 1 & "/" & bk & ",0)", bk с типом Long, то все нормально работает. А если изменить тип на Single, то опять выдает ошибку. Как правильно записать формулу в коде, чтобы она срабатывала с типом Single?
Привет всем Как найти наибольшее повторение по условию? К примеру, Магазин 1 встречается в диапазоне 3 раза и номер повторения ищется с помощью формулы =СЧЁТЕСЛИ($A$2:A2;A2). А какую формулу нужно ввести, чтобы в столбце С отображалась наибольшее количество повторений (т.е. 3), напротив ячейки с Магазином 1? Пример во вложенном файле.
Подскажите, пожалуйста, как с помощью формулы в Excel 2007 расставить номера повторений? Например, Магазин 3 встречается в столбце три раза. Нужно, чтобы в соседнем столбце, когда Магазин 3 встречается первый раз, стояла цифра "1", при втором "2" и т.д. Пример во вложенном файле.
Можно программно ввести формулу, которая частично будет состоять из данных в макросе?
Нужно посчитать продажи апельсинов по магазинам (пример во вложенном файле). Для этого я использовал формулу СУММЕСЛИМН. Можно ли для этой формулы использовать цикл, задав условия для диапазонов внутри макроса? Вот, что получилось у меня
Код
Dim WEP As Excel.Workbook
Dim WSP As Excel.Worksheet
Dim i&, m$
Dim n(2 To 3) As String
Public Sub Prostanovkaformul()
Set WEP = Application.Workbooks("Программный ввод формулы.xls")
Set WSP = WEP.Worksheets(1)
n(2) = "Магазин 1"
n(3) = "Магазин 2"
m = "апельсины"
For i = 2 To 3
WSP.Cells(i, 4).Value = "=SUMIFS(RC[-1]:R[7]C[-1],RC[-3]:R[7]C[-3]," & "n(i)" & ",RC[-2]:R[7]C[-2]," & "m" & ")"
Next i
End Sub
В таком виде формула возвращает ноль. Если убрать кавычки у n(i) и "m", то VBA отобразить ошибку. Есть ли правильная запись?