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

» Excel VBA

Автор: AndVGri
Дата сообщения: 06.04.2007 13:37
Ergistael
Количество листов в книге не может быть равно 0. Может быть 0 тActiveWorkbook.Worksheets.Count, например, но не Sheets.Count.
По поводу проверок же. В процедуре связанной с кнопкой можно проверить, для книг
Workbooks.Count - на количество книг, а чтобы выполнять действия только с Range сделать проверку:
If TypeOf Application.Selection Is Range Then
'код работы с ячейками
End If
Автор: Ergistael
Дата сообщения: 06.04.2007 14:35
Да, верно, количество книг. Про is Range - спасибо. Буду пробовать. Вылижу утилитку - куда выкладывать? Имхо, не только мне пригодится.
Автор: Oyger
Дата сообщения: 06.04.2007 16:05
Ребят. Такой вопрос.
Есть строка. У в строке забиты даы в формате "dd/mm/yy"
Мне надо с полным годом
Пешу .NumberFormat = "dd/mm/yyyy"
В меню "формат ячейки" формат меняется. А чтобы изменился в самой ячейки надо "в нее зайти" и нажать "ентер".
А как по другому? Ведь для того макрос и пишу.
Автор: AndVGri
Дата сообщения: 06.04.2007 16:40
Ergistael
Да, в принципе, где угодно. В дополнении, если работаете не с выделенными блоками ячеек, а рабочим листом напрямую то проверку можно сделать на тип листа
If TypeOf Activesheet Is Worksheet Then

Oyger
А что собственно не работает? Попробовал в макросе изменить
.NumberFormat = "dd/mm/yyyy" - формат отображения даты в ячейке поменялся на требуемый.
Может у вас ScreenUpdating или Calculation, или что-то в этом роде изменено?
Автор: aks_sv
Дата сообщения: 06.04.2007 17:41
The okk
AndVGri
Извините, долго не был на связи - работа ;((
Подскажите, как отправить файл или скришот
Автор: Yuk
Дата сообщения: 06.04.2007 18:18
Oyger
А какой исходный формат ячеек? Скорее всего Обший (или как там General). Возможно импортировалось криво.
Можно попробовать Range(...).Value = Range(...).Text



Добавлено:
aks_sv

Цитата:
Подскажите, как отправить файл или скришот

Для файла любой файлообменник. dump.ru например.
Для скриншонов удобен imageshack.us
Автор: Mpa3b
Дата сообщения: 07.04.2007 22:33
Подскажите, что мне нужно, точнее какое событие использовать, что бы
отслеживать изменения в ячеках листа, книги.
допустим, мне нужно перевод строки сделать если колличество определенных символов
(tab, enter ,пробел) достигнет нужного числа.
Есть ли возможность описывать условия для каждой ячейки, региона, регионов.
спасибо
Автор: AndVGri
Дата сообщения: 08.04.2007 03:03
Mpa3b
А куда без таких событий? SheetChange для Application, Workbook; Change - для Worksheet.
Во всех случаях - передается объект класса Range - где произошли изменения. По соответствующим свойствам Range можно узнать, что ввели, куда ввели и проверить на ваши условия.
Если не секрет, зачем вводятся
Цитата:
символов
(tab, enter

С праздником
Автор: kiVAR
Дата сообщения: 08.04.2007 12:25
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False

Dim iRow As Long

iRow = Target.Row


If Target.Column = 4& Then
If IsNumeric(Cells(iRow, 5&).Value) And IsNumeric(Cells(iRow, 4&).Value) Then
Cells(iRow, 5&).Formula = "=" & Cells(iRow, 5&).Value & "-" & Cells(iRow, 4&).Address
End If
ElseIf Target.Column = 3& Then
If IsNumeric(Cells(iRow, 3&).Value) And IsNumeric(Cells(iRow, 5&).Value) Then
Cells(iRow, 5&).Formula = "=" & Cells(iRow, 5&).Value & "+" & Cells(iRow, 3&).Address
End If
End If

Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub

Цитата:
Application.Calculation было бы не вредно вернуть назад

возвращаю назад(т.е. пишу в самом конце Application.Calculation = xlCalculationAutomatic ) а он опять начинает считать както по косячному
Автор: AndVGri
Дата сообщения: 08.04.2007 14:04
kiVAR

Цитата:
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False

и

Цитата:
pplication.EnableEvents = True
Application.ScreenUpdating = True

убери, неявной рекурсии нет. К чему тогда код подавления? А неверно что-то считать может из-за того, для примера:
в ячейке Е2 было число 3. Вводим в ячейку С2 значение 5, получаем в Е2 (как расчёт по формуле) 8, затем в ячейку D2 вводим 4, получаем 8 - 4 = 4. А желание было чтобы исходное значение Е2 (3) - 4 = -1. Так? Это не выходит? Нельзя ли конкретнее про
Цитата:
а он опять начинает считать както по косячному

Автор: The okk
Дата сообщения: 09.04.2007 08:47
kiVAR

Цитата:
iRow = Target.Row

И что будет, если Target Is Nothing? (удаление диапазона)


Цитата:
If Target.Column = 4& Then
ElseIf Target.Column = 3& Then
End If

ТАК проверки не делаются! В переводе на русский твои условия значат: если номер самого левого столбца диапазона равен 3 или 4, то. Т.е. если взять диапазон из 2,3 и 4 столбца, то условие не выполняется.
Вот так правильно:

Код: If Not Intersect (Target, Columns(4)) then
ElseIf Not Intersect (Target, Columns(3)) then
End if
Автор: AndVGri
Дата сообщения: 09.04.2007 12:05
The okk

Цитата:
И что будет, если Target Is Nothing?
- ничего не будет. В данной задаче событие Worksheet_Change не произодёт.

Цитата:
If Not Intersect (Target, Columns(4)) then
ElseIf Not Intersect (Target, Columns(3)) then
End if

И это собственно ни к чему. По условию задачи - отслеживается изменение ячейки в столбце C или D. Если быть строгим, то накладываем общее условие на единичную ячейку

Код:
If (Target.Rows.Count And Target.Columns.Count) = 1& Then
'Здесь остальной код
End If
Автор: The okk
Дата сообщения: 09.04.2007 12:21
С прошедшим тебя!

Цитата:

Цитата: If Not Intersect (Target, Columns(4)) then
ElseIf Not Intersect (Target, Columns(3)) then
End if

И это собственно ни к чему. По условию задачи - отслеживается изменение ячейки в столбце C или D.
Автор: AndVGri
Дата сообщения: 09.04.2007 12:35
The okk
И тебя с прошедшим Воскресением За Target.Cells.Count =1& спасибо, торможу.
Для чего у тебя проводится проверка на пересечение диапазонов я понял. Спорить можно здесь до хрипоты, как будут меняться ячейки (изменения в которых мы отслеживаем) и как это проверять. Автор же ставил задачу как: вводим в ячейку Cx значение, тогда в ячейке Ex пишем формулу
= Ex + Cx
Если вводим в Dx, то пишем формулу в Ex
= Ex - Dx
Так что, будет только интересно, какую формулу нужно ввести в Ex при одновременной вставке значений в Cx и Dx
Да, кстати, как это реализовать в виде формулы без VBA? Учитывая, что здесь ссылка ячейки Ex на саму себя? Да простят меня за вопрос не в том топике.
Автор: kiVAR
Дата сообщения: 09.04.2007 12:54
AndVGri
а вот и я. извеняюсь если чтото непонятно объясняю, я в vba начинающий, как нетрудно догадаться, информацию в основном черпаю из разных источников в инете, поэтому может и пишу всякую ерунду

Цитата:
для примера:
в ячейке Е2 было число 3. Вводим в ячейку С2 значение 5, получаем в Е2 (как расчёт по формуле) 8, затем в ячейку D2 вводим 4, получаем 8 - 4 = 4

всё правильно так и надо

Цитата:
убери, неявной рекурсии нет

если убераю:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim iRow As Long
iRow = Target.Row
If Target.Column = 4& Then
If IsNumeric(Cells(iRow, 5&).Value) And IsNumeric(Cells(iRow, 4&).Value) Then
Cells(iRow, 5&).Formula = "=" & Cells(iRow, 5&).Value & "-" & Cells(iRow, 4&).Address
End If
ElseIf Target.Column = 3& Then
If IsNumeric(Cells(iRow, 3&).Value) And IsNumeric(Cells(iRow, 5&).Value) Then
Cells(iRow, 5&).Formula = "=" & Cells(iRow, 5&).Value & "+" & Cells(iRow, 3&).Address
End If
End If
End Sub
то когда ввожу к примеру в то же С2 значение 5(в Е2 стоит значение 3) получаю в Е2 значение 10.
Так как мне сделать чобы считало правильно и при это не отключать калькуляцию
Автор: AndVGri
Дата сообщения: 09.04.2007 13:10
kiVAR
Ну ещё один шажок сделай. Какая формула в E2? У меня =3+$C$2 и получается собственно 8, что у тебя?
У меня всё нормально работает, если не считать, что при удалении в C2 в E2 записывается =3+$C$2, что не есть хорошо. Нужно добавлять проверку ячеек на IsEmpty
Автор: kiVAR
Дата сообщения: 09.04.2007 13:24

AndVGri
у меня после того как ввел 3 в С2 потом 5 в Е2 такая формула: "=5+$C$2"
[
Автор: AndVGri
Дата сообщения: 09.04.2007 13:54
kiVAR
Почему происходит? Это понятно первый раз ты вводишь в С2 3, в Е2 формула =+$C$2, затем ты вводишь 5 в С2 и, следовательно, значение в Е2, по выше приведённой формуле, 5. Как результат получаем =5+$C$2
Блокировками это врядли изменишь.
А какой сакраментальный смысл помещать в Ех формулу?
Если обойтись без этого то достаточно заменить в процедуре код
Cells(iRow, 5&).Formula = "=" & Cells(iRow, 5&).Value & "+" & Cells(iRow, 3&).Address
на соответствующее вычисление
Cells(iRow, 5&).Value = Cells(iRow, 5&).Value + Cells(iRow, 3&).Value
тогда таких накладок не будет. Ну и для Cells(iRow, 4&) соответственно
Автор: kiVAR
Дата сообщения: 09.04.2007 20:04
AndVGri
Огромное спасибо.

Всё работает как надо
Автор: JekaterinaA
Дата сообщения: 09.04.2007 21:22
Добрый день!

У меня такая проблема. Мне надо чтобы за один день конкретной даты (дата, например, в ячейке В1, В2...), закрашивались ячейки напротив и вылезал какой-нибудь флажок.


Подскажите, если это возможно!
Автор: AndVGri
Дата сообщения: 10.04.2007 03:21
JekaterinaA

Цитата:
акрашивались ячейки напротив

Можно условным форматированием, к чему тут VBA?
Автор: roz21
Дата сообщения: 11.04.2007 23:16
Подскажите новичку.
Не знаю как это называется, но задача такая: есть список ФИО, Адресов, Паспортных данных, и др. данных, создана форма (лист формата А4) в кот вставляются данные из этого списка, в разные места с функциями СЦЕПИТЬ и ЗАМЕНИТЬ. Нужно сформировать форму для каждой строки из списка, но при "вытягивании" все данные берутся не так как хочется. Т.е. например нужно G2=Лист2:G1
G22=Лист2:G2
G42=Лист2:G3 и т.д.

а получается: G2=Лист2:G1
G22=Лист2:G22
G42=Лист2:G42 и т.д.

Можно ли как то это решить?
Автор: The okk
Дата сообщения: 12.04.2007 06:32
roz21

Цитата:
есть список ФИО, Адресов, Паспортных данных, и др. данных

Где?

Цитата:
создана форма (лист формата А4)

Давайте называть вещи своими именами. Форма - это лист экселевской книги?

Цитата:
в кот вставляются данные из этого списка, в разные места с функциями СЦЕПИТЬ и ЗАМЕНИТЬ.

Где-то есть данные (где - пока неясно), эти данные надо перенести на лист.

Цитата:
но при "вытягивании" все данные берутся не так как хочется.

А КАК они берутся?
То есть, как они берутся сейчас и как они должны браться. Я понимаю, что есть ошибка, но сказать, где она, по предложенному описанию установить невозможно
Автор: IUnknown777
Дата сообщения: 12.04.2007 18:49
Подскажите, как выполнить поиск по всем листам по всем ячейкам, вообщем по всему документу xls на определенное значение
Автор: RedPromo
Дата сообщения: 12.04.2007 22:04
IUnknown777
Можно вот так

Цитата:
Public Function Find(Val As Variant) As Range
Dim Shet As Worksheet
For Each Shet In ActiveWorkbook.Worksheets
Set c = Shet.Cells.Find(What:="24", After:=ActiveCell, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False)
If Not c Is Nothing Then
Set Find = c
Shet.Select
c.Activate
Exit Function
End If
Next
End Function

Автор: genf
Дата сообщения: 12.04.2007 22:50
Подскажите как в Exel задать гамма-функцию. В явном виде, как в Mathcad нет (в справке написаны кое какие сведения, но ничего не получается). Например в Mathcad гамма-функция вычисляется очень просто - Г(3,2)=1,353. А как это сделать в Exel?
Автор: The okk
Дата сообщения: 13.04.2007 06:08
IUnknown777
Тут VBA не нужен. С такими вопросами - в тему по Excel.
Делается очень просто:Ctrl + F либо Правка -> Найти (открывается окно поиска)В открывшемся окне поиска на закладке "Найти" жми кнопку "Параметры >>".В параметрах выбираешь:
В графе "Искать:" в книге
В графе "Область поиска:" значенияЖмешь "Найти все"
И будет тебе счастье.
Автор: Olive77
Дата сообщения: 13.04.2007 10:42
genf
не совсем в тему. Разве, что ты планируешь программировать функцию.

Посмотри надстройку SimulAr (бесплатна должна быть).

P.S.: у меня в Excele эта ф-я есть (_http://office.microsoft.com/en-us/excel/HP052091011033.aspx). Или имеется в виду, что-то узкоспецифичное?
Автор: Mpa3b
Дата сообщения: 13.04.2007 16:05
AndVGri

Цитата:

А куда без таких событий? SheetChange для Application, Workbook; Change - для Worksheet.
Во всех случаях - передается объект класса Range....
Если не секрет, зачем вводятся
Цитата:символов
(tab, enter


Спасибо.

есть, например текст, копируем его, и по спецсимволам обрезать, переносить, фильтровать...
например, хочу, что бы после 3 слов автоматически смена ячейки была, ввожу,
ввожу, а оно само "укладывается"
И спросил с умыслом еще, если символ я введу, это точно изменение содержимого ячейки будет,
а вот спецсимвол? Например, Enter?

Автор: konfetkin
Дата сообщения: 14.04.2007 11:37
функция получает A1:B3 например. координаты первой ячейки я узнаЮ через arr.column и arr.row.
а вот как получить координаты последней ячейки или размер массива?
сам не программер, спросить больше не у кого. поможите чем можите.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Стоит ли переходить с Билдера на Делфи?


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