Тема со сферическими массивами в вакууме уже утомила, попробуем что-нибудь более близкое к реальности.
Потребовалось тут, для моего хорошего товарища, сделать автоматизацию приходных-расходных операций, для каких-то его своих нужд. Возможно, кому-нибудь еще она окажется полезной.
Все достаточно просто
- изначально, в книги есть только один лист "Автоматизация"
Каждый день нажимается кнопка "Новый день". В книге создается страничка с датой и таблицей "товаров"
Естественно, что в самый первый раз, лист будет пуст. Необходимо будет внести туда те товары, которые имеются. "Остатки" товаров с предыдущего дня переносятся на следующий.
Каждый новый месяц\год, по нажатию кнопки "Новый день" - оно ругается и просит нажать кнопку "Новый месяц или год". По нажатию этой кнопки - книга сохраняется в отдельной папке (папка создается там же, где и книга) и создается новая "пустая", с листами "Автоматизация" и листом с текущей датой (с остатками товаров). Всякие "резервные копирования" сохраняют копию книги в отдельной папке, которая будет создана там же, где находится рабочая книга.
На листе "Товары" - можно добавлять товары кнопкой "Новый товар" или прямо в таблицу (новые товары за день - отмечаются оранжевым цветом текста). Есть некоторые защиты от повторов наименований и неверного формата данных. - строки удаляются только кнопкой "Удалить выделенное" (можно выделить сразу несколько строк). Такой способ - из-за того, что лист защищен от многих "ручных" изменений - есть текстовое "поле "фильтра", над столбцом "наименование товара" (туда можно вписать часть названия и нажать Enter. Это применит фильтр к столбцу). Этот и другие фильтры можно отменить кнопкой "сбросить фильтры" - можно напечатать "отчет за день" (файл-"шаблон" прилагается) -т.к. ячейки защищены, то для сортировки необходимо выделить заголовок столбца (там, где фильтр... это временно снимет защиту) и тогда использовать сортировку через фильтр
Приложения: Видимо, тут нельзя русский язык использовать, в названиях или я чего-то не так сделал. 1ый файл необходимо переименовать в "склад" или как удобнее 2ой обязательно в "Отчет.xlsm" и положить в ту же папку, где и первый
Надеюсь, не нарушу правила форума. Готовое решение, естественно, для всех и без ограничений. Но, перед его выкладыванием тут, поговорили с товарищем, для которого оно было написано и решили, почему бы не попробовать... Если кому-нибудь оно покажется удобным и захочется серьезно доработать под собственные нужны (например- цены, ед. измерения, группы товаров и т.п.), то kostyas80@bk.ru (Константин).
День добрый, дамы и господа)
Тема со сферическими массивами в вакууме уже утомила, попробуем что-нибудь более близкое к реальности.
Потребовалось тут, для моего хорошего товарища, сделать автоматизацию приходных-расходных операций, для каких-то его своих нужд. Возможно, кому-нибудь еще она окажется полезной.
Все достаточно просто
- изначально, в книги есть только один лист "Автоматизация"
Каждый день нажимается кнопка "Новый день". В книге создается страничка с датой и таблицей "товаров"
Естественно, что в самый первый раз, лист будет пуст. Необходимо будет внести туда те товары, которые имеются. "Остатки" товаров с предыдущего дня переносятся на следующий.
Каждый новый месяц\год, по нажатию кнопки "Новый день" - оно ругается и просит нажать кнопку "Новый месяц или год". По нажатию этой кнопки - книга сохраняется в отдельной папке (папка создается там же, где и книга) и создается новая "пустая", с листами "Автоматизация" и листом с текущей датой (с остатками товаров). Всякие "резервные копирования" сохраняют копию книги в отдельной папке, которая будет создана там же, где находится рабочая книга.
На листе "Товары" - можно добавлять товары кнопкой "Новый товар" или прямо в таблицу (новые товары за день - отмечаются оранжевым цветом текста). Есть некоторые защиты от повторов наименований и неверного формата данных. - строки удаляются только кнопкой "Удалить выделенное" (можно выделить сразу несколько строк). Такой способ - из-за того, что лист защищен от многих "ручных" изменений - есть текстовое "поле "фильтра", над столбцом "наименование товара" (туда можно вписать часть названия и нажать Enter. Это применит фильтр к столбцу). Этот и другие фильтры можно отменить кнопкой "сбросить фильтры" - можно напечатать "отчет за день" (файл-"шаблон" прилагается) -т.к. ячейки защищены, то для сортировки необходимо выделить заголовок столбца (там, где фильтр... это временно снимет защиту) и тогда использовать сортировку через фильтр
Приложения: Видимо, тут нельзя русский язык использовать, в названиях или я чего-то не так сделал. 1ый файл необходимо переименовать в "склад" или как удобнее 2ой обязательно в "Отчет.xlsm" и положить в ту же папку, где и первый
Надеюсь, не нарушу правила форума. Готовое решение, естественно, для всех и без ограничений. Но, перед его выкладыванием тут, поговорили с товарищем, для которого оно было написано и решили, почему бы не попробовать... Если кому-нибудь оно покажется удобным и захочется серьезно доработать под собственные нужны (например- цены, ед. измерения, группы товаров и т.п.), то kostyas80@bk.ru (Константин).Dark_wave
Чиста не смог пройти мимо без предложения облегченного варианта функции Правда, она, похоже, нигде и не используется, но уже сделал на будущее, если понадобится. [vba]
Код
'========================================== ' Назначение : Перевод номер столбца в букву '========================================== Public Function ConvertToLetter(iCol As Long) As String ConvertToLetter = Split(Columns(iCol).Address(0, 0), ":")(0) End Function
[/vba]
Чиста не смог пройти мимо без предложения облегченного варианта функции Правда, она, похоже, нигде и не используется, но уже сделал на будущее, если понадобится. [vba]
Код
'========================================== ' Назначение : Перевод номер столбца в букву '========================================== Public Function ConvertToLetter(iCol As Long) As String ConvertToLetter = Split(Columns(iCol).Address(0, 0), ":")(0) End Function
Абсолютно! Вот фрагмент исходного кода этой функции из первого файла: [vba]
Код
'======================================================================================= ' Добавил : Dark_Wave ' Дата : 02.09.2014 ' Назначение : Перевод номер столбца в букву '======================================================================================= Public Function ConvertToLetter(iCol As Long) As String
Dim iAlpha As Long Dim iRemainder As Long iAlpha = Int(iCol / 27) iRemainder = iCol - (iAlpha * 26) If iAlpha > 0 Then ConvertToLetter = Chr(iAlpha + 64) End If If iRemainder > 0 Then ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64) End If End Function
Абсолютно! Вот фрагмент исходного кода этой функции из первого файла: [vba]
Код
'======================================================================================= ' Добавил : Dark_Wave ' Дата : 02.09.2014 ' Назначение : Перевод номер столбца в букву '======================================================================================= Public Function ConvertToLetter(iCol As Long) As String
Dim iAlpha As Long Dim iRemainder As Long iAlpha = Int(iCol / 27) iRemainder = iCol - (iAlpha * 26) If iAlpha > 0 Then ConvertToLetter = Chr(iAlpha + 64) End If If iRemainder > 0 Then ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64) End If End Function
Хочу отметить, что поскольку функция неявно обращается к активному листу (ActiveSheet), то применение функции с отсутствием активных листов вызовет ошибку, а вариант Dark_Wave самодостаточен и работает без ActiveSheet. Для данной задачи это не критично, но я уже сталкивался, когда работала надстройка возникал момент с отсутствием активных окон, и вылет по ошибке.
Хочу отметить, что поскольку функция неявно обращается к активному листу (ActiveSheet), то применение функции с отсутствием активных листов вызовет ошибку, а вариант Dark_Wave самодостаточен и работает без ActiveSheet. Для данной задачи это не критично, но я уже сталкивался, когда работала надстройка возникал момент с отсутствием активных окон, и вылет по ошибке.Skif-F
Хочу отметить, что поскольку функция неявно обращается к активному листу (ActiveSheet), то применение функции с отсутствием активных листов вызовет ошибку, а вариант Dark_Wave самодостаточен и работает без ActiveSheet.
Это верно! Но у нас с собой было! [vba]
Код
Public Function ConvertToLetter(iCol As Long) As String ConvertToLetter = Split(Application.ConvertFormula("R1C" & iCol, xlR1C1, xlA1), "$")(1) End Function
[/vba]И, кстати, исходная функция не работает при значении, скажем, 6000
Но это всё ладно! Меня смущает другое. Где в 21-м веке может потребоваться перегон номера столбца в букву? Ведь везде есть возможность обратиться к столбцу и по цифре, и по букве.
А буквы в цифры и обратно, на моей памяти, обычно перегоняют те программисты учетных систем (типа SAP, DAX, 1C), которые весьма поверхностно знают Excel и буквально перекладывают в свои системы код VBA, записанный макрорекордером, стремясь к некоторой параметризации подобных разработок путем кромсания текстовых адресов диапазонов на буквы и цифры.
Хочу отметить, что поскольку функция неявно обращается к активному листу (ActiveSheet), то применение функции с отсутствием активных листов вызовет ошибку, а вариант Dark_Wave самодостаточен и работает без ActiveSheet.
Это верно! Но у нас с собой было! [vba]
Код
Public Function ConvertToLetter(iCol As Long) As String ConvertToLetter = Split(Application.ConvertFormula("R1C" & iCol, xlR1C1, xlA1), "$")(1) End Function
[/vba]И, кстати, исходная функция не работает при значении, скажем, 6000
Но это всё ладно! Меня смущает другое. Где в 21-м веке может потребоваться перегон номера столбца в букву? Ведь везде есть возможность обратиться к столбцу и по цифре, и по букве.
А буквы в цифры и обратно, на моей памяти, обычно перегоняют те программисты учетных систем (типа SAP, DAX, 1C), которые весьма поверхностно знают Excel и буквально перекладывают в свои системы код VBA, записанный макрорекордером, стремясь к некоторой параметризации подобных разработок путем кромсания текстовых адресов диапазонов на буквы и цифры.Gustav
Gustav, да, вы почти во всем правы)) Эта функция действительно в данном решении не используется, скопипастил когда-то с сайт M$ и забыл про нее. Использовал я ее один раз где-то, для "составления" диапазона, шо-то типа: .Range("A5:C10"). И, насколько помню, там действительно это было как-то связанно с "параметризацей". В том плане, что на вход могли прийти номера столбцов, а не буквы. Правда, конечно же, на оптимальность такого пути решения совсем не претендую, совершенно уверен, что диапазон можно "составить" гораздо более изящным способом.
Но, я, действительно, с VBA работаю не так уж много... Правда, программист не учетных систем, а просто Desktop-программист) Поэтому, на текущий момент, пути решения некоторых задач и получаются гораздо ближе к Visual Basic 6.0 нежли к VBA с объектной моделью Excel, но я над этим работаю, по мере появления времени и задач. В чем этот сайт очень помогает.
И, конечно же, спасибо вам и всем, за комментарии и предложенные варианты оптимизации))
SnoopDOB, прошу прощения, я немножко попозже смогу просмотреть почту и ответить)
Добрый вечер... Точнее, уже добрый ночер)
Gustav, да, вы почти во всем правы)) Эта функция действительно в данном решении не используется, скопипастил когда-то с сайт M$ и забыл про нее. Использовал я ее один раз где-то, для "составления" диапазона, шо-то типа: .Range("A5:C10"). И, насколько помню, там действительно это было как-то связанно с "параметризацей". В том плане, что на вход могли прийти номера столбцов, а не буквы. Правда, конечно же, на оптимальность такого пути решения совсем не претендую, совершенно уверен, что диапазон можно "составить" гораздо более изящным способом.
Но, я, действительно, с VBA работаю не так уж много... Правда, программист не учетных систем, а просто Desktop-программист) Поэтому, на текущий момент, пути решения некоторых задач и получаются гораздо ближе к Visual Basic 6.0 нежли к VBA с объектной моделью Excel, но я над этим работаю, по мере появления времени и задач. В чем этот сайт очень помогает.
И, конечно же, спасибо вам и всем, за комментарии и предложенные варианты оптимизации))
SnoopDOB, прошу прощения, я немножко попозже смогу просмотреть почту и ответить)Dark_wave
На самом деле самого дела-то и нет. А наоборот, получим оборот на, и таким образом перевернем образ
Сообщение отредактировал Dark_wave - Вторник, 13.01.2015, 02:47
Всем доброго времени суток , народ помогите кому не сложно, можно ли в этот файл добавить столбец возврат?! Тоисть был расход, в один день и в тот же день пришел возврат, очень нужно что бы макрос правильно производил расчет итога за день.
Всем доброго времени суток , народ помогите кому не сложно, можно ли в этот файл добавить столбец возврат?! Тоисть был расход, в один день и в тот же день пришел возврат, очень нужно что бы макрос правильно производил расчет итога за день.ШутНик
Если кому-нибудь оно покажется удобным и захочется серьезно доработать под собственные нужды (например- цены, ед. измерения, группы товаров и т.п.), то kostyas80@bk.ru (Константин).
кажется, всё написано ещё в первом сообщении темы:
Если кому-нибудь оно покажется удобным и захочется серьезно доработать под собственные нужды (например- цены, ед. измерения, группы товаров и т.п.), то kostyas80@bk.ru (Константин).