Сломала голову, как реализовать такую задачу. Есть названия товаров, некоторые названия повторяются Нужно пронумеровать товары следующим образом,
-если название товара встречается в таблице 1 раз, то ставим 1 -если название товара встречается 2 раза, то первое вхождение получает 1, а второе такое же значение получает 2 -если название встречается 3 раза, то 1 вхождение получает 1, второе 2, третье 3
Посчитать количество значений могу по счетесли. Но как потом проставить нужную нумерацию по описанному условию?
Поставщик прислал файл. Составы написаны в неудобном формате (в примере ниже это столбец Сейчас). Т.е. сначала идет текст, затем в скобках процентное содержание.
Нужна помощь в способе, как перевернуть этот состав к привычному виду (в примере ниже это столбец Нужно. Т.е. сначала цифры с %, затем текст. Других знаков-разделителей не требуется.
Буду благодарна за любую идею: будь то формула, макрос...
Использую сумеслимн для поиска и суммирвоания данных по 2 критериям. Замечаю, что, если один или оба искомые критерии отсутствуют, то формула возвращает 0 Мне это неудобно, т.к. иногда формула может вернуть 0 просто потому, что проссумированный ею результат равен нулю.
Можно ли как-то выкрутиться и сделть так, чтобы в случае, если один или оба искомые критерии не найдеры, возвращалось бы "нет таких критериев" или хоть сообщение об ошибке Во вложении пример демонстрирует проблему
Имею такую задачу: В книге excel "Остатки"на листе "БазаДляВставки" огромный список артикулов (от 40 тыс строк и до 50-60тыс может быть), к этим артикулам надо подтянуть из другой книги excel "БазаОписаний" разные характеристики . В этой другой книге тоже кол-во строк большое (50-70-100тыс). Кол-во столбцов в ней еще больше. Мне из этой книги нужны не все столбцы, только некоторые.
Решаю задачу следующим образом: Открываю файл "БазаОписаний", нахожу в ней нужные мне столбцы и переношу их в книгу "Остатки" на доп. лист "БазаДляКопир". После чего работаю только в одной книге с двумя листами: лист, откуда копирую данные "БазаДляКопир" и лист, куда эти данные вставляю "БазаДляВставки" Ниже привожу код процедуры, которая производит поиск и вставку нужных данных из одного листа на другой.
Сейчас для обработки 45тыс строк уходит примерно 8 минут.
Первый вопрос: можно ли как-то улучшить код, чтобы ускорить его работу? Второй вопрос (боль моя и печаль). Если пытаться обработать отфильтрованные по какому-либо критерию данные, а не все строки от первой до последней, обработка происходит непревильно (скрытые фильтром строки сбивают массивы и все вставляется неправильно). Можно ли как-то изменить код, чтобы возможно было обрабатывать отфильтрованные данные?
Код
' определяю последнюю строку в базе для копирования
LR2 = ThisWorkbook.Worksheets("БазаДляКопир").Cells(Rows.Count, 1).End(xlUp).Row '
' определяю последнюю строку в базе для вставки
LR1 = ThisWorkbook.Worksheets("БазаДляВставки").Cells(Rows.Count, 7).End(xlUp).Row '
Application.ScreenUpdating = False
Application.ShowWindowsInTaskbar = False
Application.EnableEvents = False
' определяю массив ARR1 - массив данных, которые будут копироваться и массив ARR2 - массив, куда все будет вставляться
ThisWorkbook.Worksheets("БазаДляКопир").Activate
ARR1 = ThisWorkbook.Worksheets("БазаДляКопир").Range(Cells(2, 1), Cells(LR1, 12)).Value
ThisWorkbook.Worksheets("БазаДляВставки").Activate
ARR2 = ThisWorkbook.Worksheets("БазаДляВставки").Range(Cells(2, 17), Cells(LR2, 27)).Value
'в массиве ARR2 , куда планирую вставлять данные ищу те строки, где данные нужно заполнить (если в ячейке с описанием изделия пусто, значит, надо обработать)
For i = 1 To UBound(ARR2)
If ARR2(i, 2) = "" Then
' в массиве ARR1 ищу нужные данные по столбцам от 1 до 11
For j = 1 To UBound(ARR1)
If ARR2(i, 1) = ARR1(j, 7) Then
Desc = ARR1(j, 8)
TypeFabric = ARR1(j, 3)
AgeSex = ARR1(j, 1)
HTS = ARR1(j, 2)
Fabric = ARR1(j, 4)
CC = ARR1(j, 5)
DC = ARR1(j, 6)
Pic = ARR1(j, 9)
SizeUS = ARR1(j, 10)
SizeRU = ARR1(j, 11)
End If
Next
ARR2(i, 2) = Desc
ARR2(i, 3) = TypeFabric
ARR2(i, 4) = AgeSex
ARR2(i, 5) = Fabric
ARR2(i, 6) = SizeUS
ARR2(i, 7) = SizeRU
ARR2(i, 8) = HTS
ARR2(i, 9) = CC
ARR2(i, 10) = DC
ARR2(i, 11) = Pic
End If
Next
' вставляю данные
With Range(Cells(2, 17), Cells(LR2, 27))
.ClearContents
.Value = ARR2
End With
Текст состоит из букв и цифр формата "ЕАЭС N RU Д-RJ.АВ88.В.78954/20" Или RU.68.РЦ.09.0456.E.07856257.04.14
Т.е. в ячейке набор букв и цифр может быть не сплошкой (1 слово), но содержать пробелы и знаки типа "/" и "-" Сжимать пробелы нельзя. Надо сохранить заданную в ячейке структуру
Есть таблица. Нужно сцепить несколько ячеек внутри строки по условию: если текст есть, то сцепляем, если стоит "-", то пропускаем такое значение. Значения сцепливаются через ";". При этом лишних точек с запятой там, где ничего не объединяется, быть не должно.
Моя реализация задачи в файле во вложении Сцепить надо данные из столбцов А & Е & G Мои попытки в столбце Q. А то, какой результат ожидается - в столбце R Видно, что где-то у меня неправильный подход, т.к. для некоторых случаев формула работает неверно.
Очень нужна ваша помощь, если возможно, помогите с вариантом, как сцепить корректно.
Имеется таблица с данными по товарам, людям, поставщикам и пр. Некоторые столбцы заполняю данными используя процедуры, написанные на VBA Но реалии таковы, что иногра в существующую таблицу приходится добавлять новые столбцы.
Посетила мысль, что, если в макросах ссылаться на номера столбцов не прямо (1, 2, 3 и т.д.), а предварительно проводя поиск номера нужного столбца по его названию, то это позволит свободно вставлять столбцы в таблицу и не беспокоиться о том, что в ранее написанном макросе надо изменить в диапазоне столбец 3 на 4, т.к. перед ним вставили еще один. Для того, чтобы пробежаться по всем столбцам в шапке таблицы (это у меня строка 1) использовался ранее метод .Find и все работало до тех пор, пока не возникла необходимость провести поиск, когда некоторые столбцы скрыты. И оказалось, что Find не работает.
Пробуду перейти на поиск через массив (ниже пример кода с комментарием, что делаю).
Вопрос следующий: мне кажется, я делаю этот поиск в массиве неэффективно. (через множество if). Наверняка можно оптимизировать мой поиск. Если есть предложения, помогите, пожалуйста.
Код
' определяем массив
MyArr = Range("A1", Cells.SpecialCells(11)).Value
' происк провожу по 1 строке по всем столбцам (это шапка таблицы с заголовками)
For lc = 1 To UBound(avArr, 2)
'через условие в массиве ищу ячейку, где встречается нужное значение и передаю в переменную номер найденного столбца
If MyArr(lr, lc) = "Страна происхождения" Then
' передаю в переменную iCOO номер столбца, где в заголовке "страна происхождения"
iCOO = Cells(lr, lc).Column
End If
If MyArr(lr, lc) = "Наименование" Then
' передаю в переменную iDescr номер столбца, где в заголовке "Наименование"
iDescr = Cells(lr, lc).Column
End If
If MyArr(lr, lc) = "Название завода" Then
' передаю в переменную iFactory номер столбца, где в заголовке "Название завода"
iFactory = Cells(lr, lc).Column
End If
Next lc
подскажите, а у всех ли функция CBR при выборе даты на следующий рабочий день (например, сегодня я хочу подтянуть завтрашний курс USD) выдает не завтрашний курс, а сегодняшний?
На сайте ЦБ курс USD на 10/04/2020 - 74,6050. На функция возвращает 75,7499 (т.е. сегодняшний) Аналогично с кнопкой "Курс валют"
Имеется лист excel, где отмечаются оплаты поступивших счетов (номер счета, сумма, запланированная дата оплаты и пр).
Надо из этого листа брать даты запланированных на оплату счетов, по которым нет отметки "ok" об оплате, находить на соседнем листе по номеру поставки эти счета (могут упоминаться на листе больше 1 раза). И, если находится, в определенном столбце проставлять запланированную дату оплаты.
Вроде бы задачу удалось реализовать за тем исключением, что не удается после первого нахождения нужного инвойса провести дальнейший поиск в строке этого же номера, до перехода к следующему.
Файл с кодом и пояснениями прилагаю.
Прошу помочь в части продолжения поиска через FindNext или, возможно, другим способом реализовать продолжение поиска в цикле
Задача состоит в следующем. В одной общей папке, допустим ее имя "Очень большая папка" есть большое количество подпапок, в которых в свою очередь также могут быть подпапки, а в них еще подпапки. Некоторые из таких папок имеют определенное имя, например "печать". И в таких папках может лежать нужный файл excel с маской имени "файл 1*". Или там же может лежать другой нужный файл с маской имени "файл 2*"
Задача: пройтись по всем папкам и подпапкам в "Очень большой папке". заходить во все подпапки и искать папку с именем "печать".
Если находишь, заходить в нее и искать в ней файлы с заданной маской имени: либо "файл 1*", либо "файл 2*".
Если находится "файл 1", открывать его и копировать из него определенный лист в общий файл на лист 1 Если находится "файл 2", открывать его и копировать из него определенный лист в этот же общий файл на лист 2
Идеально, если будет вестись лог-файл, куда запишутся адреса тех папок с именем "печать", в которых не был найден файл ни с маской "файл 1", ни с маской "файл 2"
все файлы с шаблонами данных предоставлю. На вопросы, если что-то неточно описано, отвечу.
Имею таблицу, в которой содержится название компании и объект-склад.
Выглядит таблица так:
Объекты
-
ООО "Компания-Л" (Склад-Лес) МОСКВА
ООО "Компания и сыновья" (Склад-1-ый Терминал) Останкино
ООО "Компания и сыновья" ТРЦ Авиапарк
ООО "Компания и сыновья" ТЦ Какой-то еще
Что требуется:
Частью кода процедуры является передача в переменную части текста из таблицы. А именно, всего, что содержится после закрывающих кавычек. Т.е. в случае с первым названием переменная должна получить (Склад-Лес) МОСКВА вместо ООО "Компания-Л" (Склад-Лес) МОСКВА
Ниже код мой. Хочу в переменную AddressName записать кусок текста, обрезая все до последних кавычек + пробел Работает, но как-то неверно.
Код
With Sheets("Адреса")
jLastRow = ThisWorkbook.Sheets("Адреса").Cells(Rows.Count, 1).End(xlUp).Row
For i = 3 To jLastRow
Set rRange = .Cells(i, 1)
n11 = InStr(1, rRange, """")
n22 = InStr(n11 + 1, rRange, """")
AddressName = Right(rRange, n22 + 1)
Next
End With
Помогите разобраться, где ошибка и как ее исправить. Файл с примером прилагаю
Добрый день, Подскажите, можно ли как-то решить такой вопрос.
по каждой поставке каждому поставщику я веду таблицу с суммой оплаты, суммой поставки и разницей между поставкой и оплатой. Типа такой:
Получатель
Сумма поставки
Оплачено
Остаток (Сумма поставки - Оплачено) по получателю
поставка 1
А
100
200
100
поставка 2
Б
200
250
50
В столбце Остаток - формула условия суммесли по получателю (видно формулу в файле-примере) во вложении
О чем я мечтаю и не могу придумать, как реализовать: Чтобы при добавлении еще одной поставки получателю А в столбце остаток было видно, как распределялась сумма Оплачено Т.е. чтобы результат был такой: Для поставки 1 видно, что остаток 100 (т.к. оплатили 200, а поставка 100) А для поставки 3 остаток уже 50, т.е. вычитается сумма поставки из остатка
Получатель
Сумма поставки
Оплачено
Остаток (Сумма поставки - Оплачено) по получателю
поставка 1
А
100
200
100
поставка 2
Б
200
250
50
поставка 3
А
50
0
50
Пока вижу способ руками менять в формуле ячейку с остатком, но это не то, чего хотелось бы, хочется, чтобы этот столбец вычислялся без постоянного изменения формулы. Подскажите, такое возможно?
Имеется файл, в который автоматически накопительным итогом проставляются даты (от последней заполненной и до текущей) и курс USD с сайта ЦБ РФ. в столбец А автоматически через VBA проставляются даты в столбец В - курсы валюты на соответствующую дату Затем Все, вроде, работает. Кроме тех случаев, когда у пользователя нет соединения с интернетом и курс, соответственно, поставиться не может.
Вопрос: научите, как прервать процедуру сообщением "нет интернета" с учетом того, что обычно, после того, как курс проставлен (или не проставлен, если интернета нет), с файлом происходят дальше некоторые действия через VBA.
Имею таблицу, в столбце А - даты (формат дд.мм.гггг). Что хочу: методом VBA при открытии файла находится последняя непустая ячейка, считывается указанная в ней дата и со следующей за последней заполненной ячейки проставляются даты вплоть до текущей. Т.е. Если в таблице последняя дата - 12 мая, то макрос должен добавить вниз дату за 13, 14 и 15 (сегодняшнюю) мая. Выходные, праздничные и прочие дни не пропускаются. Проставляются все даты подряд. Т.е. было:
11.05.2015
12.05.2015
стало:
11.05.2015
12.05.2015
13.05.2015
14.05.2015
15.05.2015
Собственно, 1 шаг - нахождение последней непустой ячейки реализовано (во вложении) . А дальше как? Помогите с реализацией или похожими примерами. спасибо!
Во вложении маленькая табличка, по которой считаю размер пошлины по курсам на "сегодня" и "завтра" с целью понять, при каком курсе удобнее подавать декларацию. Поскольку иногда затягивание с подачей может привести к простою груза - одновременно считаю и то, сколько дней простоя можно себе позволить (или нельзя) при сегодняшнем курсе. Вопрос: как избежать периодически возникающей ошибки #ЧИСЛО! в формуле с использованием функции ОКРВВЕРХ если число отрицательное (кроме варианта руками менять аргумент "точность" на отрицательный)? Может, я вообще неправильно использую эту фукнцию и лучше использовать другую? Спасибо
Добрый день, форумчане. Имею код, который по маске ищет в указанной папке нужную подпапку и в ней файл по определенной маске. Если файл находится, он открывается, с ним производятся действия. Что хочу: хочу, чтобы, если в папке такой файл не был найден, формировался файл в формате .txt со списком папок, в которых нужный файл не был найден. Кусок моего кода, где, после указания папок, в которых надо искать идет их перебор:
Код
For f = 1 To ListFolders.ListCount
n = 0
fpatch = ListFolders.List(f - 1)
Set fso = CreateObject("scripting.filesystemobject")
Set sfol_1 = fso.GetFolder(fpatch)
If fpatch <> 0 Then
For Each sfol_2 In sfol_1.SubFolders
If sfol_2.Name = "на печать" Or sfol_2.Name = "НА ПЕЧАТЬ" Or sfol_2.Name = "На печать" Or sfol_2.Name = "Для печати" Or sfol_2.Name = "ДЛЯ ПЕЧАТИ" Or sfol_2.Name = "для печати" Then
For Each fil In sfol_2.Files
If fil.Name Like "*SPEC.xls*" Or fil.Name Like "*SPECIF.xls" Or fil.Name Like "*SPECIF.xlsx" Or fil.Name Like "*SPEC.xlsx*" Then
ПРОЦЕДУРА РАБОТЫ С ОТКРЫТЫМ ФАЙЛОМ
End If
Next
End If
Next
End If
Next f
Уважаемые форумчане. Имею файл. В нем по признаку "если ячейка в столбце А пустая", удаляю строки. Файл создается из некоей внешней программы, поэтому сталкиваюсь с такой проблемой: ячейка, выглядящая пустой не удаляется, т.к. в ней, вероятно, что-то есть. Что это - определить не могу. Во вложении - файл, где в столбце А ячейка А2 имеет это "нечто". В файле простой код, который не отрабатывает ячейку А2 пустой и, следовательно, не удаляет строку.
Прошу помощи. Что там и как "это" закодировать, чтобы строка удалялась.
Код
For r = lastrow To 1 Step -1
If Application.CountA(Cells(r, 1)) = 0 Then Rows(r).Delete
If Application.CountA(Cells(r, 1)) = "" Then Rows(r).Delete
Next r