Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
VBA. Вывод сообщения в системный трей Windows, Два варианта кода: попроще и сложный
 
На рабочем ПК, где установлен Windows 10 ошибка не наблюдается, работает на отлично.
Дома у меня Windows 7...

Получилось сделать с помощью другого кода. Оставлю здесь, может быть кому-то пригодится.
Код
Option Explicit

Private Declare PtrSafe Function Shell_NotifyIconW Lib "shell32.dll" (ByVal dwMessage As Long, ByRef nfIconData As NOTIFYICONDATAW) As Long
Private Declare PtrSafe Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

Private Type NOTIFYICONDATAW
  cbSize As Long
#If Win64 Then
  padding1 As Long
#End If
  hwnd As LongPtr
  uID As Long
  uFlags As Long
  uCallbackMessage As Long
#If Win64 Then
  padding2 As Long
#End If
  hIcon As LongPtr
  szTip(1 To 128 * 2) As Byte
  dwState As Long
  dwStateMask As Long
  szInfo(1 To 256 * 2) As Byte
  uTimeout As Long
  szInfoTitle(1 To 64 * 2) As Byte
  dwInfoFlags As Long
End Type

Private Const NIM_ADD As Long = &H0&
Private Const NIM_MODIFY As Long = &H1&
Private Const NIF_INFO As Long = &H10&

Private Function Min(ByVal a As Long, ByVal b As Long) As Long
  If a < b Then Min = a Else Min = b
End Function

Public Sub Toast(Optional ByVal title As String, Optional ByVal info As String, Optional ByVal flag As Long)
  Dim nfIconData As NOTIFYICONDATAW
  
  info = info & " "
  title = title & " "
  With nfIconData
    .cbSize = Len(nfIconData)
    
    .uFlags = NIF_INFO
    .dwInfoFlags = flag
    
    If Len(title) > 0 Then
      CopyMemory ByVal VarPtr(.szInfoTitle(LBound(.szInfoTitle))), ByVal StrPtr(title), Min(Len(title) * 2, UBound(.szInfoTitle) - LBound(.szInfoTitle) + 1 - 2)
    End If
    
    If Len(info) > 0 Then
      CopyMemory ByVal VarPtr(.szInfo(LBound(.szInfo))), ByVal StrPtr(info), Min(Len(info) * 2, UBound(.szInfo) - LBound(.szInfo) + 1 - 2)
    End If
  End With
  
  Shell_NotifyIconW NIM_ADD, nfIconData
  Shell_NotifyIconW NIM_MODIFY, nfIconData
End Sub

Sub ShowSystemTrayMsg()
    
    Toast "title", "msg"

End Sub
VBA. Вывод сообщения в системный трей Windows, Два варианта кода: попроще и сложный
 
Добрый день, не получается вывести сообщение в системный трей, кто знает как решить?

Скрин ошибки прикрепил
Как разделить таблицу Excel на файлы с расширением *csv по критерию первого столбца
 
Благодарю, работает! Нужное именование для создаваемых файлов допишу сам
Как разделить таблицу Excel на файлы с расширением *csv по критерию первого столбца
 
Цитата
Hugo написал:
Код в файле, запуск кнопкой (стрелка на скрине  http://prntscr.com/uvpvtd  )Код вроде простой и понятный.
Добрый день, уже больше полу года пользуюсь вашим макросом, за это время несколько модифицировал его.
Код
Sub Создать_групы_CSV()

    Dim arrData, i As Long, n As Long
    Dim Coll As New Collection
    Dim NewWb As Workbook
    Dim thisWBpath As String
    thisWBpath = ActiveWorkbook.Path

    arrData = Range("A1").CurrentRegion
    
    On Error Resume Next
    For i = 2 To UBound(arrData, 1)
        If Len(arrData(i, 1)) > 0 Then Coll.Add arrData(i, 1), arrData(i, 1)
    Next i
    On Error GoTo 0
    
    If MsgBox("Создать " & Coll.count & " файлов CSV?", vbQuestion + vbYesNo, "Вопрос") = vbNo Then Exit Sub
    
    Application.ScreenUpdating = False
    For Each Item In Coll
        n = 1
        Set NewWb = Workbooks.Add(1)
        With NewWb.Worksheets(1)
            .[A1] = "PurchID": .[B1] = "itemid": .[C1] = "PurchQty": .[D1] = "PurchPrice": .[E1] = "Site/Warehouse/Location"
            For i = 2 To UBound(arrData, 1)
                If arrData(i, 1) = Item Then
                    n = n + 1
                    .Cells(n, 2) = arrData(i, 2)
                    .Cells(n, 3) = arrData(i, 3)
                    .Cells(n, 4) = arrData(i, 4)
                    .Cells(n, 5) = "WM00315208"
                    .Cells(n, 1) = arrData(i, 5)
                End If
            Next i
        End With
        ChDir thisWBpath
        NewWb.SaveAs fileName:=thisWBpath & "\" & Item & ".csv", FileFormat:=24, Local:=True '6 '23 '62 'xlCSVUTF8
        NewWb.Close (False)
    Next Item
    Application.ScreenUpdating = True
    MsgBox "Файлы сохранены!", vbInformation, "Конец"
End Sub

Сейчас макрос создает CSV файлы по критерию первого столбца таблицы, по 1 файлу на каждое уникальное значение из первого столбца "Name".

Подскажите что нужно изменить в макросе чтоб он создавал по одному CSV файлу на каждые n уникальных значений из первого столбца (если количество уникальных значений не кратно n, тогда последний файл создается с их остатком). Значение n вводиться пользователем.

Из примера прикрепленного файла при n=10, должно получится 4 файла:
Изменено: Юрий Адамец - 24.05.2021 11:05:53
Выделить ячейки на указанную сумму
 
МатросНаЗебре, Благодарю!
Выделить ячейки на указанную сумму
 
Цитата
msi2102 написал:
Можно ПОИСКОМ РЕШЕНИЯ обойтись
Нужно именно средствами VBA, эта задача лишь часть большой задачи. Хочеться получить метод, который потом я смогу адаптировать под разные условия.
Изменено: Юрий Адамец - 15.04.2021 12:22:36
Выделить ячейки на указанную сумму
 
Добрый день. Помогите решить задачу средствами VBA.
Существует стоблец значений, нужно выделить (цветом заливки) любое количество ячеек, на сумму указанную пользователем.
Подбор слагаемых до нужной суммы с любым первым совпавшив количеством
 
Сейчас я отстранился от реальной задачи, которую я пытался описать в первом посте темы. Пытаюсь модицифировать макрос из статьи: https://www.planetaexcel.ru/techniques/11/179/, предложенный в коментариях. Мне нужно чтоб он подбирал слагаемые без заданого количества чисел выборки, а с любым первым совпавшим количеством.
Изменено: Юрий Адамец - 01.03.2021 16:42:29
Подбор слагаемых до нужной суммы с любым первым совпавшив количеством
 
Пока не получается решить, в статье представленный макрос работает с заданным количеством чисел выборки, а для моей задачи не важно какое количесто чисел выборки, подойдет любое.
Кроме того погрешноти быть не должно, нужно точное совпадение. Тут я просто строго задал погрешность = 0.

Пытаюсь модифицировать код макросса, не из основной статьи, а из коментария, заявлено что работает быстрее, и для меня показался более понятный.
Код
Sub Combinator2()
    Dim Data() As Variant, goal As Double, sel_count As Integer, prec As Double, t As Single, AddSum As Double
    Const LIMIT = 1000000
    Randomize
    
    prec = Range("D5").Value
    sel_count = Range("D2").Value
    goal = Range("D4").Value
    
    Set OutRange = Range("D8")
    Set InputRange = Range("A1", Range("A1").End(xlDown))
    input_count = InputRange.Cells.Count
    Data = InputRange.Value
    t = Timer

    Do
        AddSum = 0
        For j = 1 To sel_count
            RandomIndex = Int(Rnd * (input_count - j + 1) + j)
            RandomValue = Data(RandomIndex, 1)
            AddSum = AddSum + RandomValue
            Data(RandomIndex, 1) = Data(j, 1)
            Data(j, 1) = RandomValue
        Next j
        If Abs(AddSum - goal) <= prec Then
            Range("D3").Value = AddSum
            Debug.Print Timer - t, iterations
            MsgBox "Подбор завершен. Необходимая точность достигнута."
            Range(OutRange, OutRange.End(xlDown)).ClearContents
            OutRange.Resize(sel_count, 1).Value = Data
            Exit Sub
        End If
        iterations = iterations + 1
    Loop While iterations <= LIMIT
    Debug.Print Timer - t
    MsgBox "Достигнут лимит попыток. Решение не найдено."
End Sub
Подбор слагаемых до нужной суммы с любым первым совпавшив количеством
 
Простите, не смог понятно сформулировать задачу. Нашел на сайте решение подобной задачи: https://www.planetaexcel.ru/techniques/11/179/
Подбор слагаемых до нужной суммы с любым первым совпавшив количеством
 
Добрый день!
Помогите создать макрос который будет считать массу брутто. Принцип такой: макрос должен запрашивать у пользователя количество единиц на которое нужно добавить массу, и потом на это количество добавлять по 7 кг на единицу. Но добавлять нужно только на позиции у которых "КОД УКТ" = 9401710000.

Пример прикрепил, в нем я уже добавил по 7 кг на 155 единиц в позициях с кодом укт = 9401710000.

На первый взгляд мне показалось довольно просто написать такую программу, но потом понял что есть исключения, и при последовательном добавлении массы на каждую позицию, может оказаться в конце что последняя позиция имеет больше единиц чем нужное количество. Поэтому надо как-то из этого диапазона единиц (в рамках нужного кода) отобрать те позиции которые в сумме дадут строго заданое значение. И уже тогда только в них добавить по 7 кг на шт.
Метод сортировки в зависимости от содержания строки
 
Цитата
_Igor_61 написал:
Проверяйте
Благодарю! Работает превосходно, идею я понял, теперь смогу сам модифицировать кое что )
Метод сортировки в зависимости от содержания строки
 
Попытаюсь еще раз объяснить. Типы в первом сообщение поставил случайные для примера, ниже опишу все как в действительности есть.
Для списка названий моделей мне нужно определить типы этих моделей по большому количеству критериев. По факту это модели обивки мебели. Мне нужно узнать где из этого списка диваны, где боки диванов, где табуреты, где кровати и где кресла.

Например, если в названии модели есть сочетание символов "AR", "A10R", "A15R" тогда это боки диванов (позначаю как тип "b"). если нету, тогда это другой тип обивки, ищем дальше.

Если в названии модели есть сочетание символов "NF", "F70", "F67", "F77", ... (целый массив большой) ИЛИ название модели заканчивается символами "K3', "LL", "LS" ... (целый массив большой) ИЛИ название модели начинается символами "11", "13", "33", (целый массив большой) ИЛИ строго равно "40400", "1884LST", "1785K" (целый массив большой) ИЛИ начинается символами "31", "37", "51", "71", "76" (целый массив большой) при этом заканчивается на "S00", "M00", "L00" (целый массив большой) ИЛИ содержит "NF", но не содержит при этом "CO" - ТОГДА ЭТО ТАБУРЕТ - тип "a".

Такой же схожий набор условий для определения типа обивки для кресел. (тип "c")

Для кроватей если первые два символы название модели не цифры, тогда это кровать. (тип "l")

А если модели не попадает ни под один из критериев тогда это диван (тип "s")

п.с. сейчас все это делаю через фильтр
Изменено: Юрий Адамец - 21.02.2021 11:52:09
Метод сортировки в зависимости от содержания строки
 
Добрый день!
Будьте добры, помогите создать метод, который будет принимать строку, и в зависимосоти от ее содержания возвращать соответствующий символ.
На практике, у меня есть список моделей, каждой из них нужно назначить "тип модели".
Определения "типа модели" происходит по ряду таких критериев:
1. Если строка (название модели) вмещает одну из строк которые я предвадительно записал в массив строк 1, тогда тип "a".
2. Если строка (название модели) заканчивается на одну из строк которые я предвадительно записал в массив строк 2, тогда типа "b".
3. Если строка (название модели) начинается на одну из строк которые я предвадительно записал в массив строк 3, тогда типа "z".
4. Если строка (название модели) полностью равна одной из строк которые я предвадительно записал в массив строк 4, тогда типа "q".
5. Если строка (название модели) начинается на одну из строк которые я предвадительно записал в массив строк 5, и при этом заканчивается на одну из строк которые я предвадительно записал в массив строк 6, тогда типа "u".
6. Если строка (название модели) вмещает одну из строк которые я предвадительно записал в массив строк 7, но не содержит при этом ни одной из строк которые я предвадительно записал в массив строк 8, тогда типа "k".
7. Если не выполнено ни одно из условий, тогда записать тип "s".

Только критерии надо брать из массива в коде, а не из таблицы на листе (ее для наглядности сделал).

Файл прикрепил, вот код:
Код
Sub определить_типы()

Dim mass1(), mass2(), mass3(), mass4(), mass5(), mass6(), mass7(), mass8() As Variant

' вмещает
mass1 = Array("AR", "F70", "N11F", "LR", "LLB")
' заканчивается
mass2 = Array("L60", "H00", "F60L", "N72", "K3")
' начинается
mass3 = Array("11", "13", "31", "33")
' равно
mass4 = Array("40400", "1884LST", "1785K")
' начинается на элемент из mass5 и заканчивается на элемент из mass6
mass5 = Array("31", "37", "51", "71", "76")
mass6 = Array("S00", "M00", "L00")
' если элемент из содержит mass7, но не содержит элемент из mass8
mass7 = Array("NF")
mass8 = Array("CO")

lr = Cells(1, 1).End(xlDown).Row
    For i = 2 To lr
        Cells(i, 2).Value = получить_тип_модели(Cells(i, 1).Value)
    Next i
End Sub

Private Sub получить_тип_модели(model_name As String)

' тут опредиление типа

End Sub
Изменить высоту ячеек определенного диапазона, в зависимости от содержания последней страницы печати
 
Здравствуйте, уже 2ой день мучаюсь написать макрос, который бы увеличивал высоту ячеек определенного диапазона, если последняя строка этого диапазона, не находится на одной странице печати что и последняя строка активного листа.
Вначале я задаю параметры печати, потом вычислял последнюю строку нужного мне диапазана, последнюю строку всего листа, и страницы на котоых эти строки находятся, потом сравнивал эти номера страниц. Если эти строки нахядятся на одном листе печати, то ничего не делать, все хорошо. А если на разных, следовательно нужно увеличивать на 1 единицу высоту ячеек заданого диапазона до тех пор, пока в результате, на последней странице печати, будет как минимум последняя строка определенного диапазона.

Прилагаю наглядные скрины и код.
У меня зацикливается выполнение кода, не понимаю что делать. Вот код, я новичек в написании макросов, и плохо понимаю алгоритмы, но вот что у меня получилось:
Код
Sub формат_печати_последней_страницы()

Dim numAllPages As Long
Dim lastRowDiap As Long
Dim lastRowSheet As Long
Dim numlastRowDiapPage As Long
Dim numlastRowSheetPage As Long

' задать параметры печати
With Worksheets(1).PageSetup
 .LeftMargin = Application.InchesToPoints(0)
 .RightMargin = Application.InchesToPoints(0)
 .TopMargin = Application.InchesToPoints(0)
 .BottomMargin = Application.InchesToPoints(0)
 .HeaderMargin = Application.InchesToPoints(1.3)
 .FooterMargin = Application.InchesToPoints(1.3)
End With

With Worksheets(1).PageSetup
 .Zoom = False
 .FitToPagesWide = 1
 .FitToPagesTall = 1000
End With

' узнать количество страниц печати
ActiveWindow.View = xlPageBreakPreview
numAllPages = Worksheets(1).HPageBreaks.Count + 1


' записать номер страницы где находится последняя строка всего листа
numlastRowSheetPage = numAllPages

' узнать номер последней строки из определенного диапазона
lastRowDiap = Cells(10, 1).End(xlDown).Row

' узнать номер последней строки из всего листа
last = Cells(10, 6).End(xlDown).Row
lastRowSheet = Cells(last, 6).End(xlDown).Row

' узнать номер страницы где находится последняя строка нашего диапазона
Cells(lastRowDiap, 1).Activate
For i = 1 To ActiveSheet.HPageBreaks.Count
    If ActiveCell.Row < ActiveSheet.HPageBreaks(i).Location.Row - 1 Then Exit For
Next
numlastRowDiapPage = i

' @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
' условие если последние строки на разных страницах
Do Until numlastRowDiapPage = numlastRowSheetPage
lr = Cells(11, 1).End(xlDown).Row
rowHei = Range(Cells(11, 1), Cells(lr, 1)).RowHeight
rowHei = rowHei + 1

' узнать количество страниц печати
ActiveWindow.View = xlPageBreakPreview
numAllPages = Worksheets(1).HPageBreaks.Count + 1
ActiveWindow.View = xlNormalView

' записать номер страницы где находится последняя строка всего листа
numlastRowSheetPage = numAllPages

' узнать номер последней строки из определенного диапазона
lastRowDiap = Cells(10, 1).End(xlDown).Row

' узнать номер последней строки из всего листа
last = Cells(10, 6).End(xlDown).Row
lastRowSheet = Cells(last, 6).End(xlDown).Row

' узнать номер страницы где находится последняя строка нашего диапазона
Cells(lastRowDiap, 1).Activate
For i = 1 To ActiveSheet.HPageBreaks.Count
    If ActiveCell.Row < ActiveSheet.HPageBreaks(i).Location.Row - 1 Then Exit For
Next
numlastRowDiapPage = i
Loop
' @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ActiveWindow.View = xlNormalView
MsgBox ("Количество всех страниц: " & numAllPages & "; " & "Последняя строка в диапазоне: " & lastRowDiap & "; " & "Последняя строка на листе: " & lastRowSheet & "; " & "Номер страницы строки диапазона: " & numlastRowDiapPage & "; " & "Номер страницы последней строки: " & numlastRowSheetPage & "; ")

End Sub

Изменено: Юрий Адамец - 29.10.2020 13:48:10
Создание одной таблицы из двух разных (присвоить изделиям этикетки)
 
Благодарю, работает отменно!
Создание одной таблицы из двух разных (присвоить изделиям этикетки)
 
Спасибо, только на листе "Отчет", всегда разное количество строк (продукции), а этот макрос рапределяет нормы только для этих 4х.
Изменено: Юрий Адамец - 21.10.2020 16:32:39
Создание одной таблицы из двух разных (присвоить изделиям этикетки)
 
Здравствуйте, помогите создать макрос для создания определенной таблицы, из имеющихся двух таблиц. Словами трудно объяснить, покажу рисунком, и прикреплю файл пример задачи с решением. Количество строк в листах "Отчет" и "Нормы" всегда разное, а количество столбцов не меняется. Но еще, чтоб значение в строку "Синтепон UA" из листа "Нормы" в будущую таблицу копировались из листа "Отчет" колонки "H".
Как разделить таблицу Excel на файлы с расширением *csv по критерию первого столбца
 
Благодарю от всей души, добрые люди! Я счастлив, что нашел Вас и такой ресурс!
Как разделить таблицу Excel на файлы с расширением *csv по критерию первого столбца
 
Благодарю за ответы, пока толком не понимаю как это сделать, опыта нету, но понял что надо учить макросы, чтоб это получилось  :)
С радостью бы увидел еще какие-то варианты решения этой задачи, или наброски макросов.
Изменено: Юрий Адамец - 08.10.2020 22:33:32
Как разделить таблицу Excel на файлы с расширением *csv по критерию первого столбца
 
Здравствуйте, посоветуйте пожалуйста, как мне разделить таблицу эклесь (файл прикрепил) на файлы с расширением *csv, по критерию первого столбца.
В результате должно получится, столько файлов в формате *csv, сколько уникальных значений в первом столбце.

Для примера:
1 файл: название inv 0977, внутри все строки, в которых в первом столбце есть значение inv 0977.
2 файл: название inv 0978, внутри все строки, в которых в первом столбце есть значение inv 0978.
3 файл: название inv 0979, внутри все строки, в которых в первом столбце есть значение inv 0979.
и так далее.

И чтоб еще в созданных файлах сразу по умолчанию, создавались нужные названия столбцов, и эти части таблицы помещались под нужные столбцы. А один из этих столбцов был заполнено заданных значением (неизменяемым, константой).

файл который надо разделить и 3 файла как должно быть на выходе прикрепил.
Страницы: 1
Наверх