Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Excel VBA (часть 2)

Автор: Gavrik
Дата сообщения: 10.10.2007 10:09
Ddashevskiy

Заменить

Rows(r).Select
Selection.Delete Shift:=xlUp

на

Rows(r).Delete Shift:=xlUp

Добавлено:
а.. я тормоз ты имееш ввиду как убрать один из циклов ?
Автор: Ddashevskiy
Дата сообщения: 11.10.2007 07:41
Спасибо, большущее )

Новый нупский вопрос: как присвоить переменной целочсленного типа пустое значение?

И еще:Каким методом можно проверить пустоту диапазоноа ячеек, кроме как циклом перебирающим все ячейки в этом диапазоне?
Автор: Fandorine
Дата сообщения: 11.10.2007 08:47
Имеется бланк в виде xls-файла, в который каждый месяц заносятся данные, и сохраняются под соответствующим именем, например май.xls.
Требуется: в конце года просуммировать все данные по соответствующим ячейкам, то есть сделать файл год.xls, в котором каждая ячейка была бы суммой соответствующих месяцев (кроме текстовых ячеек, естественно )
Кто может подсказать, как это проще всего сделать? В смысле с максимальной автоматизацией.

Итоги надо подводить не только за год, но и за квартал, полугодие и т.п.
То есть задача стоит - просуммировать данные по всем файлам которые есть в папке. Это реально сделать только средствами VBA? Если да, то какие функции использовать?..
Автор: Ddashevskiy
Дата сообщения: 11.10.2007 09:07
Я создал процедуру и хочу чтоб в обработке кнопки_по_клику эта процедура выполнялась и возращала два значения, которые в ней вычисляются. Я пониамю что это дело функции, но почему-то я не могу обьявить функцию в VBA, так же не могу сделать эти переменные, в которых хранятся эти значения, публичными - глобальными. Подскажите пожайулйста как вызвать обработку того кода что я написал в модуле и как сделать переменные которые в нем вычисляются доступными в других обьектах?


Вопрос снят, просто я своими корявыми руками не правильно слово функция писал
Автор: Oyger
Дата сообщения: 11.10.2007 09:23
Fandorine

Написать макрос, значит? А взять книжечку, почитать, а уже что не ясно спросить у народа?
Я понимаю, помочь если что-то не получается или команду подсказать, ошибку найти или еще что подобное.
А тут: "разбираться мне в лом, да и работать не охота".
Тем более Твоя задача решается и "ручками".
Так как у Тебя есть
Цитата:
бланк в виде xls-файла
берешь и сохраняешь его как, к примеру, "год.xls".
Дальше в первой ячейки пишешь формулу - сумма соответствующие ячейки во всех файлах за год. Снимаешь "закрепление ячеек" в формуле и данную формулу растаскиваешь по бланку (в те ячейки куда Вам надобно).
Аналогично делаешь файл с сумой за любой другой период.
И работайте на здоровье.
Если Вы и этого не умеете (а судя по вопросу

Цитата:
Это реально сделать только средствами VBA?

- не умеете), то купите для начала "Excel для Чайников". А потом уже поговорим о

Цитата:
максимальной автоматизацией


Добавлено:
Ddashevskiy

Для начала: как ты обозвал свою процедуру? Я имею в виду не имя, а описание: публичная или еще что? Если у Тебя есть две процедуры, которые находятся в разных модулях и описаны "Private", то они друг друга "не увидят.
Во-вторых: как Ты создавал кнопку на листе Excel'я? Через "элементы управления"? То есть способ получше (по крайней мере мне нравится намного больше): в Excel'е есть панель "формы". Открываешь ее. Дальше, создаешь уже с помошью ее кнопку на листе. А кнопки назначаешь твой макрос. Но опять же, твой макрос не должен иметь описание "Private".
Автор: Ddashevskiy
Дата сообщения: 11.10.2007 09:53
Функцию я описал без приставки - по умолчанию. Кнопка на форме, форма вызывется не по событию а по запуску макроса. Кнопку на запуск макроса создал на панели инструментов через настройку (там веселая рожицца) . Большинство косяков у меня из-за среднего знания написания английских слов. Я слово функция написал с тремя ошибками - поетому она у меня и не определяется. Но вот сделать функцию публичной у меня получается - пишу public - а он мне фры...
Автор: Oyger
Дата сообщения: 11.10.2007 10:15
Как удалить это сообение???
Автор: Fandorine
Дата сообщения: 11.10.2007 10:17
Oyger
Забыл написать, вариант типа =D38+'[май.xls].'!$D38+'[июнь.xls].'!$D38... не предлагать.
Почему- долго объяснять.


Цитата:
Я понимаю, помочь если что-то не получается или команду подсказать

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

Дело в том, что работать с этой программой, если ее так можно назвать, буду не я. Желательно чтоб человек в папке выбрал нужные файлы (то есть, 3 месяца, полугодие либо год), а программа просуммировала их значения.

Автор: Oyger
Дата сообщения: 11.10.2007 10:26
Fandorine


Цитата:
я именно и прошу подсказать базовые команды, функции, которые нужны для реализации этой задачи.

Dim, Workbooks, Open, For... Next, Cells, Value, Close. Помогло?
На этой странице уже обсуждали ссылки на книги по VBA для начинающих. Начните оттуда.
Автор: Fandorine
Дата сообщения: 11.10.2007 10:34
Oyger не поверишь, помогло
Автор: RedPromo
Дата сообщения: 11.10.2007 10:54
Fandorine
Могу в кратце посоветовать
Workbooks.Open - позволяет открывать твой файл месячный главное знать где она лежит.
range - (можно использовать UsedRange) объект позволит прочитать любые данные находящиеся на твоем листе;
оператор "+" позволит просумировать любые числовые значение.


Автор: Olive77
Дата сообщения: 11.10.2007 11:01

Цитата:
Такая задача: на листе несколько графиков, нужно применить к ним некоторое действие. Причем применять это действие в порядке увеличения свойства Top объектов ChartObject, т.е. начиная с верхней диаграммы на листе и заканчивая нижней. Намекните алгоритм как это сделать.

что-нибудь типа

For Each ch In ActiveSheet.ChartObjects
sName = ch.Chart.Name
.......
Next ch

при этом, порядок перебора графиков скорее всего совпадает с порядком их создания, так что, если важно, что надо выбирать их сверху вниз, то наверное придется самому создавать массив и сортировать графики, используя свойство Top.

Но мож кто чего лучше подскажет.
Автор: oji
Дата сообщения: 11.10.2007 11:25
Есть xml-файл с выгрузкой из 1С, который необходимо открыть в Excel. При открытии автоматически создается xml-схема и у номера счетов (20-значные) переводятся в научный формат с потерей последних 6 знаков (не хватает разрядности). Для решения этой проблемы создал XML-схему, но ее нужно прописывать в каждый файл, и делать это должен бухгалтер, для которого теги — дремучий лес. Требуется сделать некий графический интерфейс (это решаемо), в котором открываемый xml проверяется на наличие схемы, и если ее нет, то дополняется ей и открывается заново, а если есть, то открывается как есть. Подскажите, куда копать.

Из вот такого:

Код:
<?xml version="1.0" encoding="windows-1251"?>
<СчетаПК ДатаФормирования="2007-09-27" ...
Автор: CMD
Дата сообщения: 11.10.2007 13:06

Цитата:
при этом, порядок перебора графиков скорее всего совпадает с порядком их создания

так и есть, перебирает по свойству Index


Цитата:
если важно, что надо выбирать их сверху вниз, то наверное придется самому создавать массив и сортировать графики, используя свойство Top.

Тоже пришел к такому выводу, еще с массивами не работал, разбираюсь...
Автор: Olive77
Дата сообщения: 11.10.2007 16:11

Цитата:
Тоже пришел к такому выводу, еще с массивами не работал, разбираюсь...

используй ReDim a(1 to 1) перед циклом и ReDim Preserve (1 to j) для сохранения предыдуших элементов в цикле
Автор: ol7ca
Дата сообщения: 11.10.2007 18:25
Помогите, плз, решить задачку:
Имеется таблица excel, где 10 столбцов и 20000 строк.
В таблице, в числе прочих, имеем наименования столбцов "месяц" (числа от 1 до 12), "имя" (ФИО) и "счет" (бухгалтерский счет, числа от 35000 до 80000).
Необходимо сделать выборочное суммирование по конкретным ФИО в поле "имя" и вставить результат в список со всеми ФИО. Результаты нужно делать за год и за месяц.
Это легко реализовать с помощью своднои таблицы. Но это не подходит.
Данная задача описана тут:
http://www.planetaexcel.ru/tip.php?aid=79
Способ 4 и 5, но
-у меня список и база в разных файлах, поэтому excel не может итоговый файл с ссылками сохранить (сообщение о нехватке ресурсов),
-выборочное суммирование, в предложенном варианте, делается по двум критериям, а у меня 3.
Автор: tec4
Дата сообщения: 12.10.2007 05:10
Здравствуйте! Подскажите, пожалуйста, можно ли в рабочей книге Excel защитить лист от удаления (один, остальные можно редатировать)?
Автор: 32sasha
Дата сообщения: 12.10.2007 12:04
Можно ли заблокировать кнопку на панели инструментов или перехватить команду и не дать ей выполняться?
Заблокировать если в ячейке a1=1 а доступно если в а1=2 с помощью VBA
Автор: Sunbeam_L
Дата сообщения: 12.10.2007 13:31
Привет.
Расскажите, пожалуйста, как можно (и можно ли) запретить (поставить пароль) пользователю что-либо делать, не прописывая пароль в макросах, для того чтоб они выполнялись (я использовала Protect/Unprotect. Password:= "..")?

Спасибо.
Автор: Oyger
Дата сообщения: 12.10.2007 14:20
32sasha
Что-то типа
If Range("A1").Value = 1 Then
CommandButton1.Enabled = True
Else
CommandButton1.Enabled = False
End If

Добавлено:
Sunbeam_L
Лично я вопрос не понял. У Тебя не работает Protrct или он Тебя не устраивает? Для того, что бы защитить лист без пароля напиши просто: Sheets("....").Protect
Или конкретизируй вопрос.

Добавлено:
ol7ca
А почему именно при помощи функции? Напиши макрос и все.
Автор: Sunbeam_L
Дата сообщения: 12.10.2007 15:20
Меня не устраивает то, что я прописываю пароль в макросе, и в принципе догадливый кастомер может туда зайти и его посмотреть. А если делать просто протект, так оин точно распротектят его.
Автор: ol7ca
Дата сообщения: 12.10.2007 21:04
Я пользуюсь внешней ссылкой для получения данных о курсах валют из интернета. Данные обновляются с заданным интервалом (1 день, 1 час...)
Как сделать чтобы новые данные автоматически заполнялись в таблицу "история курсов", причем с заданным интервалом?

Добавлено:
Иногда внося корректировки в документы, где много цифр, очень удобно использовать автоматическое закрашивание исправленных ячеек. Быть может кто-то уже пользуется подобным - подскажите как. Спасибо.
Автор: AndVGri
Дата сообщения: 13.10.2007 04:12
ol7ca

Цитата:
Как сделать чтобы новые данные автоматически заполнялись в таблицу "история курсов"

Воспользуйся Application.OnTime, с пререзапуском в выполняющей процедуре Application.OnTime на новое время её запуска. В инете есть примеры сюда

Цитата:
автоматическое закрашивание исправленных ячеек

Напиши код обработчика события Worksheet_Change(ByVal Target As Range) с анализом принадлежности Target, если нужно проверять изменение в конкретном диапазоне. На форуме примеров работы полно
Автор: Oyger
Дата сообщения: 13.10.2007 10:47
Sunbeam_L
Можно защитить вручную /смеется/.
Насколько я понял у Тебя макрос в самом файле и Ты боишься что пользователи его смогут открыть. Можно:
1) Защитить паролем и сам макрос.
2) Отдельно создай вспомогательную книгу (файл xls), где будет модуль с макросом защиты Твоей основной книги. А в основной книги, там где Ты хотел(а) вставить Protect - вставь вызов той процедуры защиты из вспомогательного файла.
Автор: maratino
Дата сообщения: 13.10.2007 18:56
RedPromo, форумчане, подскажите пожалуйста!
Здравствуйте!
Вы незнайте код для textbox который и цифрами работает

вот код, который текст признает а цифры нет

Private Sub TextBox1_Change()
If TextBox1.Text <> "" Then
Range("A2").AutoFilter Field:=1, Criteria1:="=" & TextBox1.Text & "*", Operator:=xlAnd
Else
Range("A2").AutoFilter Field:=1
End If
End Sub

Private Sub TextBox2_Change()
If TextBox2.Text <> "" Then
Range("B2").AutoFilter Field:=2, Criteria1:="=" & TextBox2.Text & "*", Operator:=xlAnd
Else
Range("B2").AutoFilter Field:=2
End If
End Sub
Автор: ZYXELs
Дата сообщения: 14.10.2007 19:16
Добрый день!

Поскажите, каким методом можно убрать появляющееся окно при печати, о том что раздел выходит границы печати, либо сделать автоматическое подтверждение, или установить в настройках какой-либо парамер?

Весь день бился, не нашел....
Автор: RedPromo
Дата сообщения: 14.10.2007 19:30
Sunbeam_L
Я бы сказал что независимо даже если поступить по методу Oyger то использовав соответствующую прогу можно получить доступ до твоего макроса без особых проблем, программеру. А от малоопытного пользователя реально защитися так можно.


maratino
Может так попробуеш


Код: Range("A2").AutoFilter Field:=1, Criteria1:="=" & Str(TextBox1.Text) & "*", Operator:=xlAnd
Автор: Oyger
Дата сообщения: 14.10.2007 20:51
RedPromo
Насколько я поняли из просьбы Sunbeam_L, основная проблема в том, чтобы защитить листы книги макросом, а не сам макрос. Причем макрос в той же книге. Но тогда пароль могут спереть из самого макроса. Если защитить паролем и сам макрос, то его можно хакнуть - спору нет. А если сделать так (что я и предлогал выше):
Есть исходный файл в котором нужно защитить листы паролем (к примеру, файл "1.xls"). Создаем вспомогательный файл ("2.xls"), в котором будет код защиты листов в файле 1. А в самом макросе, в фале 1, вставляем ссылку запуска кода в файле 2.
Пользователю потом отдаем файл 1 для работы. И даже если он открое код и разберется в нем - увидит только ссылку на другой макрос. А пароля нет.
Если что не так понял - ссори.
P.S.: Хотя есть и программы, которые хакают пароли и для самой книги и для листов Excel'я.
Автор: maratino
Дата сообщения: 14.10.2007 23:00
RedPromo
Пишет эррор 13
я сам не разбираюсь в программирование. может я что то не так делаю
Автор: Ddashevskiy
Дата сообщения: 15.10.2007 06:42
Господа, есть необходимость объеденить ячейки с конкатацией данных, есть ли какое-то свойство у метода Merge или все придется делать ручками?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

Предыдущая тема: Написание своего HyperTerminal для считывания данных


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.