art_TD, добрый день. Количество товара (ВЕС_Тест!B:B, Тест!D:D) в моих формулах не учитывается. На листе ВЕС_Тест учитываю только 2 красных столбца (A и F - Артикул и Брутто ОБЩИЙ). Точно так же и в вашей формуле в столбце I, которую я подробно рассмотрел - на листе 'ВЕС для ВПР из упак.листа' используется 6-й столец, F (ВПР(B2;'ВЕС для ВПР из упак.листа'!A:F;6;ЛОЖЬ)):
Код
=ОКРУГЛ(ПРОСМОТР(9^9;ВПР(B2;'ВЕС для ВПР из упак.листа'!A:F;6;ЛОЖЬ))/СЧЁТЕСЛИ($B$2:$B$9999;B2)+ЕСЛИ(СЧЁТЕСЛИ($B$1:B2;B2)=1;ПРОСМОТР(9^9;ВПР(B2;'ВЕС для ВПР из упак.листа'!A:F;6;ЛОЖЬ))-СЧЁТЕСЛИ($B$2:$B$9999;B2)*ОКРУГЛ(ПРОСМОТР(9^9;ВПР(B2;'ВЕС для ВПР из упак.листа'!A:F;6;ЛОЖЬ))/СЧЁТЕСЛИ($B$2:$B$9999;B2);2);0);2)
Я вместо И/ИЛИ использую */+, для краткости. В арифметических выражениях ИСТИНА=1, ЛОЖЬ=0. Функция ЕСЛИ воспринимает 0 как ЛОЖЬ, любое другое число как ИСТИНА. Запись:
Следует избегать размещения в формулах УФ сложных вычислений. Это приводит к головной боли при отладке и к тормозам на больших данных. Вместо этого выделяйте под формулы столбец/строку и в УФ ссылайтесь на готовый результат. Заполнил для примера декабрь (1-я строка идеально подошла).
На закрытых файлах многие функции не работают, в т.ч. те функции, которыми можно удобно адресовать вычисляемый диапазон (ИНДЕКС и ДВССЫЛ). Набросал ещё вариант, но работать он будет при сортированном столбце [2.xlsx]Sheet1!$B:$B (как в вашем примере).
PS. Обратите внимание, что формулы, начинающиеся с "=ПОИСКПОЗ(..." - массивные (вводятся через Ctrl-Shift-Enter). А вот формулу "=СУММПРОИЗВ(..." можно вводить как обычную, т.к. функция СУММПРОИЗВ() сама массивная. В обоих случаях нужно ограничивать размер массивов: пишем $B1:$B999 для обработки 999 строк (с запасом). Если не указываем размер ($B:$B), то обычные формулы работают с заполненным диапазоном листа (34 строки в 2.xlsx), а массивные обработают все доступные строки (1048576), что приведёт к сильным тормозам.
А можно не погружаться в алгоритмические пучины, а использовать VBA.Replace:
Код
Sub Test()
Dim aValue, r As Long, c As Long
'ActiveSheet.UsedRange.Replace "Рразд1", Range("A1").Value
With ActiveSheet
aValue = .UsedRange.Value
For r = LBound(aValue, 1) To UBound(aValue, 1)
For c = LBound(aValue, 2) To UBound(aValue, 2)
aValue(r, c) = Replace(aValue(r, c), "Рразд1", .Range("A1").Value, compare:=vbTextCompare)
Next
Next
.UsedRange.Value = aValue
End With
End Sub
Не вижу смысла делать лишние телодвижения. Если хотите посмотреть файл с новой формулой - скопируйте мой предыдущий файл (по ссылке выше в этой теме) и вставьте формулу в ячейку C2.
Формула громоздкая получилась, ищет последнее вхождение цифры (0..9) и возвращает левую часть строки до него. Не на всех срабатывает (см. в самом конце, где дата прилепилась): "с Октябрьское 5-й пер А-Х Кадырова 12 Асовханов Руслан Увайсович/01/2024".
Sanja, написал: Длина текста в ячейке не должна быть больше 255 символов. Ограничения Excel.
Ограничение Excel - 32К, а это какое-то непонятное ограничение от Characters().Delete.
Всем привет, соединил идею от sokol92, (заменив "<Cell><Data ss:Type=""String"">" на "<Data ss:Type=""String"">" - так у меня сработало) с перебором ячеек от Sanja,. Вот такой "кентаврик" получился.
Код
Sub Bold_Italic_Tags()
Dim iCell As Range
Dim iRng As Range
Dim s As String
On Error Resume Next
Application.ScreenUpdating = False
With ActiveSheet
'для изменения стилей шрифта выбран столбец 'A'
Set iRng = .Range("A1:A" & .Cells(.Rows.Count, "A").End(xlUp).Row)
End With
For Each iCell In iRng
s = iCell.Value(xlRangeValueXMLSpreadsheet)
s = Replace(s, "<Data ss:Type=""String"">", "<ss:Data ss:Type=""String"" xmlns=""http://www.w3.org/TR/REC-html40"">", Compare:=vbTextCompare)
s = Replace(Replace(s, "<b>", "<B>", Compare:=vbTextCompare), "</b>", "</B>", Compare:=vbTextCompare)
s = Replace(Replace(s, "<i>", "<I>", Compare:=vbTextCompare), "</i>", "</I>", Compare:=vbTextCompare)
iCell.Value(xlRangeValueXMLSpreadsheet) = s
Next
Application.ScreenUpdating = True
End Sub
Создание новой книги с листом из старой + печать листов, vba. копия определенного листа из одной книги в другую и последующей печатью нескольких страниц из определенных листов.
Тут предлагают переименовать vbe6ext.olb (такое расширение) в vbe6ext.old (имитировать удаление) в папках: C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6 C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT. OLB
Далее запустить Excel, VBE и попробовать выполнить процедуру восстановления. Если не получится - попробовать скопировать C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB в C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB.
Если макрос повесить на событие Worksheet_Calculate или Worksheet_Change, то это существенно замедлит работу (экспериментировал).
В файле Книга1.xlsm нет таких действий по событиям, нашёл лишь:
Код
Sub Макрос3()
ActiveCell.FormulaR1C1 = _
"=""='""&Кнопки!R9C2&""[""&Кнопки!R10C2&""]""&""1_В'!$C$6"""
'...
End Sub
В этом случае следует сначала проверять содержимое ActiveCell.FormulaR1C1 и менять его только при необходимости:
Код
sFormula = "=""='""&Кнопки!R9C2&""[""&Кнопки!R10C2&""]""&""1_В'!$C$6"""
If ActiveCell.FormulaR1C1 <> sFormula Then
ActiveCell.FormulaR1C1 = sFormula
End If
art_TD, приветствую. Формула в целом логичная. Я бы вот так переписал (убрал мешающие ограничения в строках типа $B$9999, разбил на строки Alt-Enter и работаю на копии листа ВЕС):
И у меня такой вопрос возник. На остатках в 1 коп. формула работает хорошо (10/3): 10-3*3,33 = 0,01. Результат: 3.34, 3.33, 3.33. А если будет такой вариант? 9/8 = 1,125 ≈ 1,13 9-8*1,13 = -0,04. Результат: 1,09 + 7 раз по 1,13. Или даже так: 270/240 = 1,125 ≈ 1,13 270-240*1,13 = -1,2. Первый результат будет отрицательным? Если такие варианты возможны в вашей задаче, давайте попробуем по-другому распределять копейки. UPD. Тогда вот так можно:
В A1 - строка времени вида: "12 час. 47 мин. 35 сек.", "1 ч 47 м 35 с", "1 ч. 47 мин.", "47 мин.", "47 м.", "35 сек.", "35 с.". Это чтобы получить время в часах, для числового формата. Чтобы получить время в нормальном виде (для формата Время "чч:мм:сс") - нужно убрать "24*".
zhlobus, добрый день. Отвечаю по вашей просьбе с другой темы.
У меня таких наработок по VBA нет, и сам я редко пишу на VBA. Даже если надёргать готовых кусочков кода с этого форума, то наверное целый день займёт написание (я нетороплив). И жалко не только само время, а ещё и то, что задача явно одноразово-специфичная, и впоследствии не вижу пользы для себя от неё.
Поэтому вижу 2 способа решения:
1. Простой и быстрый, но затратный - обратиться в раздел Работа.
Местные спецы помогут вам, причём скорость написания и качество кода будут на порядок выше, чем у меня.
2. Можно посмотреть в сторону моей программы (бесплатной), которая обновляет шаблонные XLS-файлы из других XLS-, TXT-файлов.
Что она в текущей версии не умеет (по вашей задаче):
добавлять в конец заполняемого листа (давно думал о такой возможности, но по моим практическим задачам это не нужно было).
обрабатывать книги с паролем - нужно обговорить подробнее, с примером.
В общем, это поправимо, можно будет внести в программу коррективы. Однако как быстро будет - не могу оценить.
А сама папка "\\s-dat-03\personal$\azhloba\Desktop\25-КВ_ГТН_СД -Жлоба" создаётся командой MkDir? Если нет, то попробуйте вместо MkDir (она может чудить на сетевых путях):
Код
With CreateObject("Scripting.FileSystemObject")
.CreateFolder folderPath & oCell
End With