Доброго времени суток, друзья! Возникла нужда: Макросом записать в ячейку формулу, возвращающую написание формулы из другой ячейки и ее расчетное значение. В ячейке таблицы, например B2 находится формула: =ОКРУГЛ(0,55*1,75*1,15;3), которая возвращает значение, равное 1,107 нужно в активной ячейке, скажем D2, запустить макрос, по Ctrl+f:
Код
Sub FormulaPlusZnacenie()
'
' FormulaPlusZnacenie Макрос
' В ячейку записывается формула и ее расчет. Возвращает формулу и рассчитанное ее значение.
'
' Сочетание клавиш: Ctrl+f
'
Dim fRZn As String
fRZn = InputBox("1. Скопируйте в буфер содержащуюся в ячейке формулу;" & Chr(10) & _
"2. Выберите ячейку, в которую нужно вставить формулу и ее расчетное значение;" & Chr(10) & _
"3. Запустите <Ctrl + f> данный макрос и в окно ввода вставте содержимое буфера.", "Скопируйте из буфера:")
'ActiveCell.FormulaR1C1 = "=TEXT(""ОКРУГЛ(0,55*1,75*1,15;3)"","""")&"" = ""&ROUND(0.55*1.75*1.15,3)"
ActiveCell.FormulaR1C1 = "=TEXT(" & Chr(34) & fRZn & Chr(34) & "," & Chr(34) & Chr(34) & ")&"" = " & Chr(34) & fRZn
End Sub
Добрый день, друзья! Собственно вопрос в названии: Autofilter запускает пользовательский макрос - как это сделать? На листе таблица, по столбцу, выполняется Autofilter, после его выполнения происходит запуск макроса.
ну для начала, ту табличку, что Вы выложили в виде .PNG, неплохо бы было выложить в .xls Да и макрос приложить полностью, ну это ежли хотите решение "под ключ".
Из своего опыта: 1) Для каждого менеджера сделать ОТДЕЛЬНУЮ таблицу. 2) Для СЕБЯ сделать такую же таблицу, только с полем "менеджер". 3) Сделать единый справочник клиентов. На любой момент времени таблицу для себя, иметь возможность сформировать вновь, путем опроса кодом ВБА таблиц менеджеров.
... ну, тогда все просто: в цикле Do ... Loop идем по колоночке код и собираем в массив наши сборные названия, ну а в пристяжку к ним и все остальные данные. Это как вариант ...
Здравствуйте, Вопрос: как быть если на один код приходится несколько наименований? Например: попробуйте на листе "результат" сформировать ячейку "наименование объекта" для кода: х.123.35. Если не ошибаюсь, то в ячейку можно записать конечное число символов и, в данном случае мы его превысим ...
могу предложить: создать таблицу "ЖХО" (Журнал хозяйственных операций) Ну, и раз уж Вы используете данное понятие, то и План счетов неплохо бы иметь. ПС накидал тут по-быстрому примерную схемку - таблички. (Чур, тапками не бить!)
Уважаемый Alien Sphinx, не сердитесь, пожалуйста. Я лишь хотел сказать, что распределение затрат между подразделениями - задача, на первый взгляд простая. На самом деле многое зависит от объективно-субъективных представлений тех для кого эта инфа готовится. Подвох заложен в понимании "размер подразделения". Автор не уточняет, чем определяется этот размер: объемом приносимых благ в общий котел; количеством сотрудников; их уровнем зарплаты и ... много еще какими параметрами, известными только автору. Это не в СССР, когда базой распределения, например счета 25 был по всей стране установлен ФОТ основных производственных рабочих. Нынче каждая фирма Учетной политикой это дело сама себе затверждает. Если не ошибаюсь. Поэтому и посоветовал Автору с бухгалтером проконсультироваться, ну если он у них не только "оператор 1С". А жена у меня вообще - акушер на пенсии
e.fedoseev, Вам бы Теорию бухгалтерского учета почитать и практику формирования и закрытия счетов 25; 26; 23 Плана счетов ... Ну или посоветоваться с бухгалтером.
Спасибо большое! Все работает. Может кому пригодится, вот так это будет:
Код
Sub test2()
With ActiveCell
.Value = ChrW(2012) 'вниз
'.Value = ChrW(2017) 'вверх
With .Font
.ThemeColor = xlThemeColorAccent6
.TintAndShade = -0.249977111117893
End With
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
End With
End Sub
Добрый день, коллеги! нужно чтобы при работе макроса в ячейку записывался символ "треугольник с вершиной вниз", который можно получить при вводе с клавиатуры комбинации клавиш Alt + 31 (31 - на цифровой клавиатуре). Написал код:
Код
Sub test2()
ActiveCell.Select
With Application
.SendKeys "%{31}"
End With
With Selection
With .Font
.ThemeColor = xlThemeColorAccent6
.TintAndShade = -0.249977111117893
End With
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
End With
End Sub
работает все, кроме вставки самого символа. Он не вставляется. Может кто подскажет, в чем ошибка?
Уважаемый, Genn0k, как же я Вам, по-доброму завидую: У Вас есть и "книга" и "таблица заполненная"! А вот у меня этого ничего нет! - Пойду напьюсь с горя, что ли! Может Вы все же избавите меня от греха винопития - опубликуете пример с книгой и таблицей заполненной, ну и формулу Вашу заодно поставите где нужно ...
и, это правильно! Ну, что поделаешь: - Эпоха ЕГЭ! Нас, в свое время, еще в школе учили: что такое цитата и, как с нею работать!? А уж в институте и подавно! Спецом конспекты по Истории КПСС препод проверял и, если цитирование выполнялось неправильно (большими, неотражающими суть мысли, кусками), незачет был обеспечен. Да, давно это было! А нынче - расп-ство в отношениях; в написаниях и в жизни ... ЕГЭ, одним словом! Сочувствую!
New написал: у какого-нибудь крана подставляется фото швабры
Посмотрел ВНИМАТЕЛЬНО и, вот что получилось:
Код
Sub Test1()
Dim oShape As Shape
Dim wSt As Worksheet
Dim cRn As Range, cLL As Range, cCL As Range
Dim sLt As Single, sTp As Single, sWt As Single, sHt As Single, sXcentre As Single, sYcentre As Single
Dim cX As Single, cY As Single
Dim nC As Long, nR As Long
Set wSt = ThisWorkbook.ActiveSheet
Set cCL = wSt.Cells
For Each oShape In wSt.Shapes
'1) - пишем в переменные координаты картинки
With oShape
sLt = .Left
sTp = .Top
sWt = .Width
sHt = .Height
End With
'2) - рассчитываем центр картинки
sXcentre = sLt + sWt / 2
sYcentre = sTp + sHt / 2
'3) - определяем координаты ячейки, по центру которой находится данный рисунок
'- по X:
cX = 0
For Each cLL In cCL.Columns
cX = cX + cLL.Width
If cX > sXcentre Then Exit For
Next
nC = cLL.Column
'- по Y:
cY = 0
For Each cLL In cCL.Rows
cY = cY + cLL.Height
If cY > sYcentre Then Exit For
Next
nR = cLL.Row
'4) - теперь "вяжем" как сказал <<Пытливый>>
With oShape 'задаем изменять размеры без сохранения пропорции и перемещать с ячейками
.LockAspectRatio = msoFalse
.Placement = xlMoveAndSize
'задаем ширину, высоту и привязку верха и левой границы к определенной ячейке
.Top = Cells(nR, nC).Top
.Left = Cells(nR, nC).Left
.Height = Cells(nR, nC).Height
.Width = Cells(nR, nC).Width
End With
Next oShape
End Sub
Да, друзья. Решил вроде задачку: - конвертировал файлы (в этом эпизоде реальности их - 86) с помощью: ABBYY FineReader 14 в файлы .xlsx Собрав результаты конвертации в папку: ...\1 - создал файл и записал в него код (пришлось воспользоваться кодом с данного форума, компилируя его):
Код
Sub Get_All_File_from_Folder()
Dim sFolder As String, sFiles As String
Dim topT As String
Dim wbOu As Workbook
Dim wsOu As Worksheet
Dim nROu As Long
Dim wbIn As Workbook
Dim wsIn As Worksheet
'
Set wbOu = ActiveWorkbook
Set wsOu = wbOu.ActiveSheet
nROu = 3
'диалог запроса выбора папки с файлами
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = False Then Exit Sub
sFolder = .SelectedItems(1)
End With
sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
'отключаем обновление экрана, чтобы наши действия не мелькали
' Application.ScreenUpdating = False
sFiles = Dir(sFolder & "*.xls*")
Do While sFiles <> ""
'открываем книгу
Set wbIn = Application.Workbooks.Open(sFolder & sFiles)
Set wsIn = wbIn.ActiveSheet
'действия с файлом
'========================
nRIn = Range(FindCellIs01_(wsIn, "ОСНОВНЫЕ ХАРАКТЕРИСТИКИ", False)).Row + 1
'Stop
sborka = ""
Do
With wsIn
If sborka = "" Then
sborka = .Cells(nRIn, 1).Text & ". " & .Cells(nRIn, 2).Text & " = " & .Cells(nRIn, 3).Text
Else
sborka = sborka & Chr(10) & .Cells(nRIn, 1).Text & ". " & .Cells(nRIn, 2).Text & " = " & .Cells(nRIn, 3).Text
End If
End With
nRIn = nRIn + 1
Loop While wsIn.Cells(nRIn, 1).Text <> ""
'========================
'Закрываем книгу
'wbIn.Close True 'если поставить True - книга будет закрыта с сохранением изменений
wbIn.Close False 'если поставить False - книга будет закрыта без сохранения изменений
'== записываем собранный результат = In ==
With wsOu
.Cells(nROu, 2) = sFiles
.Cells(nROu, 3) = sborka
End With
nROu = nROu + 1
'== записываем собранный результат = Ou ==
sFiles = Dir
Loop
'возвращаем ранее отключенное обновление экрана
' Application.ScreenUpdating = True
End Sub
Function FindCellIs01_(ByVal wsFind As Worksheet, paramFind As String, ySNo As Boolean)
'Поиск ячейки с paramFind и нахождение крайней занятой колонки в строке с ней:
With wsFind.UsedRange
Set h = .Range(.Cells(1, 1), .Cells(.Row + .Rows.Count - 1, .Column + .Columns.Count - 1)).Find(What:=paramFind)
End With
If ySNo = True Then
With wsFind
lCol = .Cells(h.Row, Columns.Count).End(xlToLeft).Column
End With
End If
If Not h Is Nothing Then
If ySNo = True Then
'сообщаем
MsgBox "Параметр " & Chr(34) & paramFind & Chr(34) & " находится в ячейке: " & h.Address & Chr(10) & _
"крайняя, занятая колонка, в строке с параметром = " & lCol, vbInformation + vbOKOnly, "Ура !!!"
End If
'возвращаем
FindCellIs01_ = h.Address
Else
If ySNo = True Then
'сообщаем
MsgBox "Параметр " & Chr(34) & paramFind & Chr(34) & Chr(10) & _
"НЕ НАЙДЕН!", vbCritical + vbOKOnly, "Караул!!!"
End If
'возвращаем
FindCellIs01_ = ""
End If
End Function
- результатом работы кода стала сборка: рис3
Теперь осталось написать функцию, вытаскивающую размеры в ячейки и задача будет решена. Но, даже этот этап уже показал, что все не зря. Размеры в ОЛ ОТЛИЧАЮТСЯ.
файл .pdf содержит вот такой текст: (рис1). Вручную, я получаю вот такую таблицу: (рис. 2). Т.е. на каждую запись в ячейке колонки J, я "навесил" гиперссылку, следующим макросом:
Код
Sub addHyperLinksInCell()
'для работы с Опросными листами [ОЛ]
'устанавливаем Гиперссылку в ячейку на документ [ОЛ] имя которого указано в ячейке
Dim ws As Worksheet
Dim pozis As Range
Dim nR As Long, nC As Long
Dim zn As String
Dim pth As String
Dim tpFl As String
Set ws = ActiveWorkbook.ActiveSheet
pth = "..._Тбл ()\2. ОЛ\"
tpFl = ".pdf"
With ws
nR = 7
nC = 10
Do
Set pozis = .Cells(nR, nC)
With pozis
If .Hyperlinks.Count = 0 Then
zn = .Text
.Hyperlinks.Add Anchor:=pozis, _
Address:=pth & zn & tpFl, _
TextToDisplay:=zn
zn = ""
End If
End With
Set pozis = Nothing
nR = nR + 1
Loop While .Cells(nR, nC) <> Empty
End With
pth = "": tpFl = ""
Set ws = Nothing
End Sub
и по гиперссылке открываю .pdf-файл. В открытом файле выделяю указанный на рис. 1 блок и копирую его в ячейку таблицы. Попробовал макрорекордером записать этот процесс - не пишет он выделение и копирование.
Добрый день! Есть набор файлов .pdf, их имена записаны в таблицу. Возможен ли следующий сценарий: "идем" по ячейкам таблицы с именами, открываем файлы .pdf и из каждого открытого файла копируем текст в ячейку таблицы Excel, правее ячейки с именем?
Sub h()
'===
Dim blokIn As Range '-
Dim blokZgl As Range '-
Dim indd As Range '-
Dim L As Long '-
Dim arrNbr '-
Dim arrNbrTo() '-
Dim s As String '-
'===
Dim Inn As Range '- что ищем
Dim Start As Range '-
With ThisWorkbook
Set blokIn = .Sheets("Данные").Range("C2:C84") ' где искать
Set blokZgl = .Sheets("Данные").Range("A1:G1") ' заголовки таблицы данных
Set Inn = .Sheets("Вывод").Range("E4") ' что ищем -> Идентификатор
Set Start = .Sheets("Вывод").Range("B13") ' откуда начинаем вставлять
End With
'структура выводимого блока данных:
s = "№;ФИО;телефон;город"
arrNbr = Split(s, ";", , vbTextCompare) '- задаем массивом структуру выводимого блока данных
'итак: _
просматриваем лист "Данные", находим Идентификатор Inn
L = 0 'счетчик = 0
For Each indd In blokIn 'из блока ячеек "где искать", очередная ячейка
If indd.Text = Inn.Text Then 'если текст в ячейке = текст в ячейке "что ищем", то
'
If L = 0 Then
'создаем новый двумерный массив
ReDim arrNbrTo(0 To UBound(arrNbr), 0 To L)
Else '
'увеличиваем крайнюю [0 To L] размерность двумерного массива, с сохранением [Preserve] предыдущих записей
ReDim Preserve arrNbrTo(0 To UBound(arrNbr), 0 To L)
End If
'пишем в созданный массив данные из найденной записи, согласно структуры выводного блока данных
'для чего, просматриваем массив структуры и,
For i = LBound(arrNbr) To UBound(arrNbr)
'блок ячеек заголовка
For Each ttt In blokZgl
'если значения совпали, то
If ttt.Text = arrNbr(i) Then
'пишем в массив
arrNbrTo(i, L) = ThisWorkbook.Sheets("Данные").Cells(indd.Row, ttt.Column).Text
'выходим из просмотра блока ячеек заголовка
Exit For
End If
Next
Next i
'счетчик +1
L = L + 1
End If
Next
Erase arrNbr '- удаляем массив структуры
If (Not Not arrNbrTo) <> 0 Then
' Массив был инициализирован, так что все готово. [Array has been initialized, so you're good to go.]
'пишем собранные данные в блок листа "Вывод"
For i = LBound(arrNbrTo, 2) To UBound(arrNbrTo, 2)
For j = LBound(arrNbrTo, 1) To UBound(arrNbrTo, 1)
Start.Offset(i, j) = arrNbrTo(j, i)
Next j
Next i
Erase arrNbrTo '- очищаем двумерный масси данных
Else
' Массив НЕ был инициализирован [Array has NOT been initialized]
MsgBox "Записей, по данному Идентификатору" & Chr(10) & _
"НЕ ОБНАРУЖЕНО.", vbCritical + vbOKOnly, "Идентификатор: " & Inn
Exit Sub
End If
End Sub
Дмитрий ХхХ написал: поиск индификатора копирование строчки вставка
дело в том, что "копирование" не всегда таковым является. Возможно, конечно, как советует уважаемый Ігор Гончаренко, отсортировать и потом копировать. Быть может это даже окажется быстрее - на каком то этапе пути! Но, а что если данные нужны потом и, в первоначальном виде? - Опять сортировка! Проще, на мой взгляд, собрать их в двумерный массив и затем из него выгрузить.
ПС Дмитрий ХхХ, как совет: не пренебрегайте отступами при написании кода. Вы, пока еще, новичок. И читабельность на этом этапе важна не менее, чем знание на память синтаксиса. Не усложняйте себе жизнь. Хорошие привычки - помогают хорошо жить. Это совет. А советы, как известно, можно не воспринимать.
зачастую, идентификатором начала блока данных служит номер колонки таблицы. У меня это, как правило "00_" или "01_". Вот его и ищим:
Код
'Поиск ячейки с "01_" и нахождение крайней занятой колонки в строке с ней:
With Sheets("Лист1")
Set h = .Range(.Cells(1, 1), .Cells(10, .UsedRange.Column + .UsedRange.Columns.Count - 1)).Find(What:="01_")
lCol = .Cells(h.Row, Columns.Count).End(xlToLeft).Column
End With
'сообщаем
If Not h Is Nothing Then
MsgBox "Параметр 01_ находится в ячейке: " & h.Address & Chr(10) & _
"крайняя, занятая колонка, в строке с параметром = " & lCol
End If
ну, или более сложный вариант:
Код
Sub test()
nRIn = Range(FindCellIs01_(ActiveSheet, "01_", False)).Row
nROu = Range(FindCellIs01_(ActiveSheet, "Итого:", False)).Row
MsgBox "- начала блока = " & nRIn & Chr(10) & "- окончания блока = " & nROu, vbInformation + vbOKOnly, "номер строки:"
End Sub
Function FindCellIs01_(ByVal wsFind As Worksheet, paramFind As String, ySNo As Boolean)
'Поиск ячейки с paramFind и нахождение крайней занятой колонки в строке с ней:
With wsFind.UsedRange
Set h = .Range(.Cells(1, 1), .Cells(.Row + .Rows.Count - 1, .Column + .Columns.Count - 1)).Find(What:=paramFind)
End With
If ySNo = True Then
With wsFind
lCol = .Cells(h.Row, Columns.Count).End(xlToLeft).Column
End With
End If
If Not h Is Nothing Then
If ySNo = True Then
'сообщаем
MsgBox "Параметр " & Chr(34) & paramFind & Chr(34) & " находится в ячейке: " & h.Address & Chr(10) & _
"крайняя, занятая колонка, в строке с параметром = " & lCol, vbInformation + vbOKOnly, "Ура !!!"
End If
'возвращаем
FindCellIs01_ = h.Address
Else
If ySNo = True Then
'сообщаем
MsgBox "Параметр " & Chr(34) & paramFind & Chr(34) & Chr(10) & _
"НЕ НАЙДЕН!", vbCritical + vbOKOnly, "Караул!!!"
End If
'возвращаем
FindCellIs01_ = ""
End If
End Function
ПС Друзья, подскажите, как вставить рисунок в текст самого сообщения? Есть такая возможность?
Никогда не говори никогда! Зря Вы так категорично. Ведь в данном приложении - программирование, задумывалось создателями и, реализуется инструментально, как "авторучка" для неленивых людей. И не слушайте
Цитата
vadim-kholkin написал: Тогда мне даже написали, чтобы я заканчивал с программированием.
Это неправильный совет. Вам, просто нужно почитать что нибудь из основ по программированию на ВБА; обратить внимание на синтаксис написания кода. И дело пойдет. А это такое дело - оно всегда поможет. Удачи и обращайтесь, если что ...
Мария, прошу прощения за то, что балагурю в Вашей теме. По теме: Вы не пишете, какие значения должны получится. Есть мысль: убрать кавычки вокруг цифр в формуле. Но, это не точно ...
подскажите, пожалуйста, как Вы это делаете? Я про вставку скриншота. Пытался через Изображение, но там требует сохраненного на диск файла. Оно так и должно быть? Или есть более интересный путь?