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

Страницы: 1 2 След.
Исключить ввод в TextBox более чем одной запятой., VBA EXCEL
 
Цитата
написал:
Максим Белич ,  так у Вас вопрос по регулярным выражениям или задача исключить ввод более одной запятой?
Задача исключить ввод более одной запятой) Спасибо, пользователь с ником Апострофф оперативно помог!
Исключить ввод в TextBox более чем одной запятой., VBA EXCEL
 
Делаю программу на VBA которая работает с дробными числами. В моей форме существует TextBox в который пользователь вводит значения. Т.к. этот текст бокс создан исключительно для работы с числами я сделал определённую "заглушку" на ввод текста следующим образом:
Код
Private Sub TextBox_number_Change()
    If Me.TextBox_number.text <> "Дробное число" Then
        If Me.TextBox_number.text Like "*[!0-9,]*" Then
            Me.TextBox_number.text = Left(Me.TextBox_number.text, Len(Me.TextBox_number.text) - 1)
        End If
    End If
End Sub
Вся "заглушка" скрывается именно в 3 строчке кода. Если введенный знак не число или не запятая, то оно удаляется.
И вот тут вопрос: как сделать так, чтобы пользователю было разрешено вводить только 1 раз запятую?
Изменено: Юрий М - 10.09.2023 18:46:45
Перестал работать экспорт Диаграмм в excel, VBA EXCEL
 
Цитата
написал:
Так?
Да, так работает. Не понятно почему теперь ошибки нет..
Перестал работать экспорт Диаграмм в excel, VBA EXCEL
 
Цитата
написал:
При пошаговом выполнении Вашей процедуры вроде все рисуется. Возможно Excel не видит диаграмму при открытой форме. Или что-то в этом роде. Попробуйте отрисовку на листе и вставку диаграммы в форму производить в другой последовательности. См.файл
Хороший вариант если отрисовка диаграммы происходит только 1 раз при открытии формы. Но у меня же это происходит очень часто и поэтому закрывать и открывать форму не получится. Хотелось бы разобраться почему в том простом примере где только 3 процедуры происходит ошибка...
Перестал работать экспорт Диаграмм в excel, VBA EXCEL
 
Цитата
написал:
Попробуйте запускать форму немодальноUserForm1.Show vbModeless
Всё равно ошибка. Я заметил нюанс, что если за комментировать строчку
Код
    'Убираем границу фигуры
    ch.Line.Visible = msoFalse
То тогда оно более менее работает. По крайне мере ошибка не вылетает сразу.
Перестал работать экспорт Диаграмм в excel, VBA EXCEL
 
Цитата
написал:
Если мне надо вставить рисунок, то я делаю что то типа такого:
У меня в программе диаграмма рисуется в зависимости от введённых данных пользователем и всё время автоматически обновляется. Вариант с тем, чтобы выбирать фото через проводник не совсем подходит.
Попробовал добавить строчку    
Код
MyChart.Activate
На этой строчке стала происходит ошибка "Method Activate of object '_Chart' failed"
Изменено: Максим Белич - 04.09.2023 11:00:26
Перестал работать экспорт Диаграмм в excel, VBA EXCEL
 
Ребят, апаю тему. Создал простейшую книгу с простейшей формой. Теперь ошибка не то что бы появляется через раз, а появляется каждый раз на строчке Chart.Export
Файл прикрепляю там всего 3 процедуры, буду благодарен если кто-то посмотрит и даст свой комментарий.

UPD. Заметил одну особенность, что если убрать в процедуре "drawDiagram" все строчки кода где я видоизменяю отображение диаграммы (отключаю оси, сетку, меняю стиль) ошибки нету. Как это может быть связано?  
Изменено: Максим Белич - 03.09.2023 11:53:21
Перестал работать экспорт Диаграмм в excel, VBA EXCEL
 
Цитата
написал:
Если мне надо сохранять график в рисунок, то я делаю типа такого:
Спасибо, интересная идея. Как затем этот рисунок загнать в переменную Picture и сохранить на рабочий стол?
Перестал работать экспорт Диаграмм в excel, VBA EXCEL
 
Для своей программы мне понадобилось сделать создание диаграммы в листе Excel, затем экспорт этой диаграммы в .gif картинку, а затем вставка этой картинки на мою форму. В принципе всё получилось, всё работает, но вчера когда игрался с формой вылетела ошибка
Run-time error '-2147467259 (80004005)':
"Method 'Export' of Object '_Chart' Failed"

Код где возникает ошибка:
Код
Sub exportAndLoadDiagram(uf As EarthForm)
    'Скачиваем и закачиваем диаграмму
    Dim CurrentFileName As String
    CurrentFileName = Workbooks("Проект.xlsm").Path & "/current.gif"
    
    Dim MyChart As Chart
    Set MyChart = Workbooks("Проект.xlsm").Worksheets("Диаграмма грунтов пикета").ChartObjects("EarthOnPicketDiagram").Chart
    'Ошибка вот здесь
    MyChart.Export CurrentFileName, "GIF"
    
    uf.Image_earthOnPicket.Picture = LoadPicture(CurrentFileName)
    '=====================
    
    'Удаляем с листа диаграмму
    Workbooks("Проект.xlsm").Worksheets("Диаграмма грунтов пикета").Shapes("EarthOnPicketDiagram").Delete
End Sub
И самое интересное, что эта ошибка случается через раз. Иногда может случиться, а иногда нет. Полазив в интернете я увидел, что такая ошибка у людей с 2003+ года. Но толкового решения не нашёл. Может быть его и нету..
Может есть решение? Или подскажет кто-нибудь каким альтернативным способом можно экспортировать диаграмму в форму?
Кому интересно файл прикладываю
Изменено: Максим Белич - 02.09.2023 11:26:08
Почему происходит создание объекта 2 раза?, VBA EXCEL
 
Цитата
написал:
попробуйте заменить на:Код ? 123Sub openForm()    UserForm1.ShowEnd Sub
Получилось именно с этим вариантом. Т.е. ваш макрос V1 работает именно так как и я этого ожидаю. А всего лишь потребовалось изменить строчку с открытием формы.
Большое спасибо.
Почему происходит создание объекта 2 раза?, VBA EXCEL
 
Вопрос может показаться глупым для знатоков, но прошу объяснить что здесь происходит.
Есть 1 простая форма -> UserForm1
Данная форма запускается через кнопку на листе. Я поставил в процедуре инициализации обычный MsgBox чтобы отслеживать когда вызывается эта процедура.
При нажатии на кнопку на листе создаётся объект данной формы:
Код
Sub openForm()
    Dim obj As New UserForm1
    obj.Show
End Sub
После 3 строчки вызывается процедура UserForm_Initialize():
Код
Private Sub UserForm_Initialize()
    MsgBox "init userform1"
    Call Module1.proc("userform1")
End Sub
На экран выводится сообщение "init userform1".
Далее, вызывается другая процедура куда передаётся текст. Вот код этой процедуры "proc(text as String"
Код
Sub proc(text As String)
    If text = "userform1" Then
        Dim fm As UserForm1
        Set fm = UserForm1
    End If
End Sub
В данной процедуре proc я хочу присвоить ссылку на свою форму UserForm1 переменной fm, чтобы например добавить туда динамически какой-нибудь Control. Но почему-то после 4 строчки процедуры proc код перекидывается на процедуру UserForm_Initialize() и происходит новая отбивка MsgBox "init userform1" (т.е. по идее создаётся новый объект формы). И работая с переменной fm изменений в UserForm1 не происходит. А я ожидаю, что переменной fm присвоится уже открытая форма.
Прошу помощи сообщества в разборе этой логики работы VBA. Сам макрос прикладываю.
Создание диаграммы с накоплением с помощью VBA, VBA EXCEL
 
Цитата
написал:
Добрый день. Попробуйте добавить параметр PlotBy:=xlRows в SetSourceData:
Всё получилось, огромное спасибо!!!
Изменено: Максим Белич - 30.08.2023 15:14:18
Создание диаграммы с накоплением с помощью VBA, VBA EXCEL
 
Хочу создать с помощью кода на vba 3д диаграмму с накоплением (пример - фото Пример.jpg)
С помощью макро рекордера записал последовательность действий и получил следующий код:
Код
Range("Таблица1").Select
    ActiveChart.ClearToMatchStyle
    ActiveChart.ClearToMatchStyle
    ActiveSheet.Shapes.AddChart2(286, xl3DColumnStacked100).Select
    ActiveChart.SetSourceData Source:=Range("Лист1!$I$2:$J$3")

Код прекрасно понимаю, хочу воссоздать всё сам, пишу следующее:
Код
    Dim obj As ListObject
    Set obj = Workbooks("Macro.xlsm").Worksheets("Лист1").ListObjects("Таблица1")
    Dim ch As Shape
    
    Set ch = ActiveSheet.Shapes.AddChart2(286, xl3DColumnStacked100)
    ch.Name = "my diagram"
   
    ch.Chart.SetSourceData Range("Лист1!" & obj.DataBodyRange.Address)
В итоге сколько бы раз я не пытался всегда получается диаграмма на картинке "Результат.jpg"

Это совсем не то, что ожидается. Может быть кто-то сталкивался с такой проблемой?
Изменено: Максим Белич - 30.08.2023 14:34:02
Рисование или подобие рисования в userform, На VBA
 
Всем спасибо! Мне идеально подойдёт обычная диаграмма! И сразу нашёл видео как сохранить диаграмму в gif файл а затем вставить этот гиф на форму. Оставлю здесь для будущих поколений
ссылка на ютуб
Рисование или подобие рисования в userform, На VBA
 
Пишу программу для работы.
Есть приложенный файл "Грунты.jpg". Вопрос стоит в следующем: пользователь в форме вводит все данные о грунтах в форму, они сохраняются (сейчас не важны нюансы), затем необходимо сделать так, чтобы при нажатии на кнопку запускался скрипт, который по ведённым данным от пользователя отрисует в форме что-то подобное, что и на картинке. Принимаются все идеи как это возможно сделать с помощью VBA в Excel.
Не прошу готового решения, а только идею, например, как бы вы это сделали.  
WithEvents для Label, VBA EXCEL
 
Цитата
написал:
См.фалИ СТАТЬЮ
Огромное человеческое спасибо.
WithEvents для Label, VBA EXCEL
 
Цитата
написал:
А это как выглядит?Может файл приложите?
Конечно, держите. В файле Label не создаются динамически. Просто обычненький на форме, хотя бы с ним разобраться бы.
WithEvents для Label, VBA EXCEL
 
Цитата
написал:
МожетPublic WithEvents lb As MSForms.Label
Сделал public. Но пока что без изменений.
В самой юзер форме нужно что-то сделать? Например создать объект?
Изменено: Максим Белич - 29.08.2023 18:58:20
WithEvents для Label, VBA EXCEL
 
Динамически создаю несколько Label на своей UserForm. Т.к. создаю динамически нет возможности обратиться приватной процедурой в самой форме к определенному Label
Хочу сделать событие которое будет вызываться при клике на какой-либо Label.
Делаю так:
Создал класс LabelEventHandler
Там содержится следующий код:
Код
Private WithEvents lb As MSForms.Label



Private Sub lb_Click()
    MsgBox "click"
End Sub

Запускаю форму, кликаю на Label и ничего не происходит. Подскажите в чем дело.
Список названий столбцов в умной таблице, VBA
 
Цитата
написал:
Для списка комбобокса нужен одномерный массив, а вы передаёте двумерный массив- строку …
    Я не помню, есть ли исключение для двумерного массива- столбца , так что попробуйте
Me.ComboBox_nameOfColumns.List =  Application.Transpose ( table.HeaderRowRange.value )
    Если не поможет, то нужно в цикле перегнать двумерный массив-строку в одномерный массив.
сработало, спасибо))
Список названий столбцов в умной таблице, VBA
 
Есть умная таблица (ListObject). В данной таблице n-ое количество столбцов со своими названиями.
Какой есть просто способ или приём выгрузить эти названия столбцов и присвоить их в Combobox?
Сначала была идея сделать с помощью поля HeaderRowRange объекта ListObject, но в комбобокс почему-то переносится только название первой колонки, а необходимы все. Как можно это просто сделать? Желательно без всяких циклов и т.д)
Код
dim table as ListObject
Set table = Workbooks("Проект.xlsm").Worksheets("Лист1").ListObjects("MyTable")

Me.ComboBox_nameOfColumns.List = table.HeaderRowRange.value //!! В комбобоксе название только первой колонки объекта table! 
Как получить Range заголовка умной таблицы в VBA?
 
Выразился некорректно. Вы правы, Range текста столбца. Спасибо за HeaderRowRange
Как получить Range заголовка умной таблицы в VBA?
 
Есть объект obj типа ListObject. Для сортировки необходимо получить Range заголовка. Вопрос - как его получить?
Код
obj.ListColumns(1).DataBodyRange - возвращает "тело" таблицы под заголовком. Неподходит
obj.ListColumns(1).Range - возвращает весь Range (и заголовка и самой таблицы). Неподходит
Просто так крашится Excel и VBA, Automation Error
 
Цитата
написал:
В редакторе VBA нажмите Debug — Compile
И исправляйте все косяки по коду, до тех пор пока компиляция не выполнится
Попробовал так сделать, но ексель аварийно закрывается.
Что говорить, если я пытаюсь выделить код и вырезать его (ctr-x) и он также закрывается. Тут дело явно не в коде.
Просто так крашится Excel и VBA, Automation Error
 
И снова здравствуйте, форумчане
Пишу для работы программу в экселе. Вчера сохранился, вышел, всё работало хорошо
Сегодня пришел и уже ничего не работает. (т.е. работает через раз, но чаще не работает  :) ). Файлы скину ниже (сначала открываем базу данных, затем проект и в макроредакторе открываем форму CAPOForm через F5 ну или F8). Скидываю архивом т.к. используется папка с иконками.

С самого начала появлялось MsgBox "Automation Error". Пытался найти причину на какой строке кода крашится программа. Выяснилось, что при Option Explicit у меня есть переменная без типа. Ну сделал ей тип.. на какое-то время заработало но не полностью (что-то загружалось, что-то нет)
Самое смешное, что даже если я банально делаю в коде VBA CTR-A и CTR-X - он просто вылетает со всеми открытыми книгами (файл поврежден?). Даже если нажимаю на кнопку стоп (RESET - синий квадратик) при не запущенном макросе он крашится.
Уже успел прочитать на просторах интернета про CodeCleaner, но у меня Windows 64-bit'ный и эксель, полагаю, тоже.
Также прочитал, что за MultiPage есть какой-то грешок ("MultiPage'и не могут обработать параметры выдаваемые им во время загрузки формы (могут только после загрузки формы").
Кто-нибудь знает что делать? Мой эксель и VBA всё?
Подскажите элегантное решение, Фильтрация 3-х и более столбцов с последующим получением информации через VBA
 
Цитата
написал:
Цитата
Максим Белич: необходимо сделать фильтрацию:
не путайте сортировку с фильтрацией и ваша проблема станет намного более понятной. Все фильтры делаются в одном цикле по "строкам" двумерного массива с отбором "строк" в новый (или тот же) массив, учитывая данные в соответствующих "столбцах" массива. Сортировку также можно сделать кодом, не трогая лист.
Раньше грешил тем, что путал фильтрацию и сортировку) Теперь точно знаю что есть что! Но в своем примере я почему-то не подумал про сортировку и всё подстраивал именно для фильтрации.
Способ с сортировкой на первый взгляд кажется намного легче, чем эти костыли в виде коллекций уникальных значений фильтра, сбрасывания фильтра при каждой итерации цикла и т.д.
Буду изучать дальше. Всем спасибо  :)  
Изменено: Максим Белич - 05.12.2022 13:24:17
Подскажите элегантное решение, Фильтрация 3-х и более столбцов с последующим получением информации через VBA
 
Цитата
написал:
посортируйте Таблицу2 по трем ключам: стране, размеру и цене
дальнейшие операции станут элементарными получите решение задачи в 25 строк кода
Можно пожалуйста пример который отобразит ход вашей мысли?  :)  Любой, хоть на коленке.
Пока в работе не было надобности сталкиваться с сортировкой и пока этого делать не умею, но думаю сложного там мало и разобраться смогу.  
Подскажите элегантное решение, Фильтрация 3-х и более столбцов с последующим получением информации через VBA
 
Здравствуйте. Вопрос требует вникнуть в задачу, поэтому буду благодарен за его изучение и уделенное время.
Нахожусь в поиске нормального решения для своей задачи. Данный пример приведён для простоты восприятия поставленной задачи
Есть умная таблица (List Object) (1 Фото.). В ней имеются 4 столбца. (Продукт | Цена | Размер коробки | Страна производства)

Конечная цель составить список на подобии тому, что приведено на фото 2. Т.е. нужно произвести фильтрацию по столбцам с последующим занесением информации в Word.

В данный момент времени вопроса о том, как занести это в Word нет. Вопрос в том, как красиво без решения "в лоб" сделать фильтрацию по 3 столбцам.
Т.е. необходимо сделать фильтрацию:
1) По столбцу Страна производства
Затем
2) Размер коробки
Затем
3) Цена
Взять информацию о продукте или продуктах. Затем по колонке цена необходимо сделать другой фильтр (если он там есть). Например в нашем примере другой фильтр имеется: Сначала идёт страна Индия, маленькая коробка, и имеется два вида цены (50 и 100). После того, как фильтры по цене закончатся необходимо поменять фильтр по полю "Размер коробки" и повторить все операции. Думаю логика задачи понятна.
Теперь о коде
С наскоку "родилось" следующее:



Код
Sub Макрос1()
    Dim country As New Collection
    Dim size As New Collection
    Dim price As New Collection
    
    Dim table As ListObject
    Set table = Workbooks("пробник.xlsm").Worksheets("Лист2").ListObjects("Таблица2")
    
    'Собираем все значения в столбце "Страна производства"
    Set country = getValuesInColumn(table, "Страна производства")
    'Собираем все значения в столбце "Размер коробки"
    Set size = getValuesInColumn(table, "Размер коробки")
    'Собираем все значения в столбце "Цена"
    Set price = getValuesInColumn(table, "Цена")
    
    Dim counterForCountry As Long
    Dim counterForSize As Long
    Dim counterForPrice As Long
    
    'Начинаем фильтровать колонку "Страна производства" по одному из доступных значений:
    For counterForCountry = 1 To country.Count
        'Если какой-то фильтр в таблице имелся - сбросим его
        If table.AutoFilter.FilterMode Then
            table.AutoFilter.ShowAllData
        End If
        
        table.DataBodyRange.AutoFilter 4, country(counterForCountry) '- теперь наша таблица отфильтрована по столбцу "Страна производства"
        
        'Начинаем фильтровать колонку "Размер коробки" по одному из доступных значений:
        For counterForSize = 1 To size.Count
            'Сбрасываем фильтр по данной колонке если он там был
            table.DataBodyRange.AutoFilter 3
            'Фильтруем по доступному полю из коллекции
            table.DataBodyRange.AutoFilter 3, size(counterForSize)
            
            'Начинаем фильтровать колонку "Цена" по одному из доступных значений:
            For counterForPrice = 1 To price.Count
                'Сбрасываем фильтр по данной колонке если он там был
                table.DataBodyRange.AutoFilter 2
                'Фильтруем по доступному полю из коллекции
                table.DataBodyRange.AutoFilter 2, price(counterForPrice)
                '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                'Прямо здесь у нас есть информация о продукте с которой мы можем что-либо сделать
                '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            Next counterForPrice
            'Сбрасываем фильтр по колонке "Цена"
            table.DataBodyRange.AutoFilter 2
        Next counterForSize
        'Сбрасываем фильтр по колонке "Размер коробки"
        table.DataBodyRange.AutoFilter 3
    Next counterForCountry
End Sub

'Функция, которая возвращает коллекцию значений без повторений в переданной таблице переданной колонке.
Function getValuesInColumn(table As ListObject, nameOfColumn As String) As Collection

    Set getValuesInColumn = New Collection
    
    On Error Resume Next
    Dim counter As Long
    Dim value As String
    For counter = 1 To table.ListRows.Count
            value = Intersect(table.ListRows(counter).Range, table.ListColumns(nameOfColumn).DataBodyRange).value
            getValuesInColumn.Add value, value
    Next counter
    
End Function
Это как раз-таки то самое решение в лоб - в итоге 3 цикла, все циклы находятся в друг друге и образовывается своеобразная матрёшка. А что если таких столбцов будет не 3, а 4 или 5? Очень легко где-то ошибиться.
И да, могут быть такие случаи, когда программа фильтрует столбец по значению, которого нет в фильтре, но который есть в коллекции. Т.е. например страна Индия, коробка маленькая, а цена 75. Такой цены нету и после фильтра в таблице становится 0 строк. Этот случай не стоит рассматривать.
Вопрос в том, как сделать код менее громоздким, более понятым.
Я новичок в VBA и могу не знать каких-то специальных "трюков" для таких задач. Буду рад увидеть любые решения и любой полёт фантазии!
Изменено: Максим Белич - 05.12.2022 12:03:01
Фильтрация умной таблицы используя VBA с последующим чтением информации, VBA
 
Цитата
написал:
Код
    [URL=#]?[/URL]       1  2  3  4  5  6  7      Sub   tt()          With   ActiveSheet.AutoFilter.Range              For   Each   ff_   In   .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)                  ff_.  Select              Next   ff_          End   With    End   Sub   
 
Как всегда, спасибо  
Фильтрация умной таблицы используя VBA с последующим чтением информации, VBA
 
Есть простая умная таблица (ListObject). В ней всего 2 колонки: Фрукт и цена (1 фото)

Мне необходимо отфильтровать фрукты по цене (например показывать только те фрукты, которые стоят 100) и затем вывести их на экран.
Простыми манипуляциями делаю фильтр и пытаюсь вывести первую строку на экран (Фото 2)(по идее должно выводиться "100 Груша")
Но на экран выводится самая первая строка моей таблицы "200 Персик"

Есть ли способ после фильтрации как-то получить информацию из таблицы?

Способ с помощью цикла, чтобы пройтись по каждой строчке таблицы и сравнить его с нужным значением (в данном случае 100) не очень подходит, т.к. в реальном проекте необходимо последовательно вывести информацию из таблицы фильтруя по нескольким колонкам сразу.
Изменено: Максим Белич - 02.12.2022 16:09:41
Страницы: 1 2 След.
Наверх