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

» Excel VBA

Автор: le3ch
Дата сообщения: 03.04.2007 07:25
The okk
Заранее диапазон неизвестен.
Но если бы он был известен, то я не понимаю как бы отработал ваш вариант?
Автор: The okk
Дата сообщения: 03.04.2007 08:00
le3ch
Вот тебе процедура. В проверяемом диапазоне будут выделены синим значения, которые есть в Проверочном диапазоне.

Код: Sub ВЫДЕЛИТЬ_СОВПАДЕНИЯ(Проверяемый_диапазон As String, Проверочный_диапазон As String)
Dim rngTestRange As Range, rngSearchRange As Range, Cell As Range
Set rngTestRange = Names(Проверяемый_диапазон).RefersToRange
Set rngSearchRange = Names(Проверочный_диапазон).RefersToRange
For Each Cell In rngTestRange
If Not rngSearchRange.Find(Cell) Is Nothing Then _
Cell.Interior.ColorIndex = 5
Next Cell
End Sub
Автор: AndVGri
Дата сообщения: 03.04.2007 08:44
The okk
Спасибо всё заработало. А по поводу FaceID, так у меня то ж показывает. Мне надо было дальше, чтобы выбранная кнопка-переключатель задавала соответствующее изображение для пользовательской кнопки пользовательской же панели, которые заданы в списках. Чтоб на бумажку FaceID не выписывать
Автор: le3ch
Дата сообщения: 03.04.2007 08:54
The okk
Спасибо, макрос отличный.

Цитата:
есть функции ПРОСМОТР и ПОИСПОЗ, которые ищут по массиву

Блин походу я туплю , но все же в качестве аргумента искомого элемента может выступать только - число, текст, логическое значение, либо ссылка на один из этих типов?
Автор: The okk
Дата сообщения: 03.04.2007 08:55
AndVGri
А, вон оно что! Делаешь надстройку для выбора значка для кнопки. Да, полезная вещь - ведь в экселе почему-то очень ограниченный набор значков. Будешь менять стандартное контекстное меню?

Добавлено:
le3ch

Цитата:
в качестве аргумента искомого элемента может выступать только - число, текст, логическое значение, либо ссылка на один из этих типов?

Ну правильно. А тебе это и надо. В качестве аргумента будет выступать сама ячейка, точнее, ссылка на нее. Чтобы не пришлось писать это по сто раз, формула пишется в стиле R1C1 (ссылка ячейки на саму себя выглядит, как RC). Если же формула пишется в стиле А1, то содаешь условное форматирование для одной яейки, а потом заполнением или копированием делаешь то же форматирование для всего диапазона.
Но раз у тебя границы диапазона меняются, то тебе условное форматирование не поможет, поскольку оно устанавливается руками для определенных ячеек, а тут они заранее не определены.
Автор: AndVGri
Дата сообщения: 03.04.2007 10:37
The okk

Цитата:
Да, полезная вещь - ведь в экселе почему-то очень ограниченный набор значков. Будешь менять стандартное контекстное меню?

Ну, не совсем так. Чтобы не разводить оффтоп, если интересно, да и вдруг кому пригодится, выложил здесь
Автор: SERGE_BLIZNUK
Дата сообщения: 03.04.2007 10:46
le3ch ещё добавлю пять копеек...
решение похожей задачи от ZORRO2005 в теме Excel FAQ
только в формуле используйте ссылку на ваш диапазон: =СЧЁТЕСЛИ(диапаз1;...)


Автор: Farest
Дата сообщения: 03.04.2007 13:27
Вот такая задачка помогите решить её
Private Sub ComboBox2_Change()
Select Case Cells(2, 9).Value
Case "Нажимной гарнитур"
Rows(18).Hidden = True
Case "Скоба (Прямоугольная)"
Rows(18).Hidden = False
Case Else
Rows(18).Hidden = False
End Select
End Sub
Можно ли вписать сюда или дописать код
каторый меняет название ячеек.
Тоесть в одной ячейке меняется название а в другой ячейке пишется заменившееся название.
Если можно обращайтесь в аську.213550720
Автор: AndVGri
Дата сообщения: 03.04.2007 13:37
Farest
А при чём тут ComboBox?
If Cells(i, k).Value <> Cells(j, l).Value Then
Cells(j, l).Value = Cells(i, k).Value
End If
Где: i, k - номер строки/столбца ячейки где меняется название, а j, l - номера строки/столбца ячейки где нужно изменить название
Автор: The okk
Дата сообщения: 03.04.2007 14:01
AndVGri
честно говоря, тоже не понял. Видимо, ComboBox лежит на листе, как ActiveX или что-то вроде. Он привязан через Source к ячейке (2,9). (сразу возникает вопрос, почему список не был сделан через проверку данных?) Когда он меняется, что-то на листе тоже творится. Вот что должно происходить на листе - не ясно. Зачем нужно что-то писать в другие ячейки тоже, честно говоря, не ясно, поскольку в экселе существует встроенный инструмент для отслеживания изменений.
Вот так я это понял. Не факт, что понял правильно.
Автор: hackman
Дата сообщения: 04.04.2007 12:08
Здраствуйте. Макрос который убирает ошибку деления на ноль я доработал. Он ставит формулу ЕСЛИ только на ячейки с ошибками. Подскажите как сделать так, что б макрос работал только с ошыбками ДЕЛ/0, а остальные ошыбки не обрабативал. (например знач или ССЫЛКА).

Код:
Public Sub AddIf_to_eror_formula()


Dim cFormulaCol As Integer
Dim i As Long, vFormula As String
Dim vFirst As Long, vLast As Long

For cFormulaCol = 1 To 256

vFirst = ActiveSheet.UsedRange.Row
vLast = vFirst + ActiveSheet.UsedRange.Rows.Count - 1&
'IsNumeric(Cells(i, cFormulaCol).Value
For i = vFirst To vLast
vFormula = Trim$(Cells(i, cFormulaCol).Formula)
' If IsNumeric(Cells(i, cFormulaCol)).Value Then GoTo 5 Else GoTo 10
5
If Application.WorksheetFunction.iserror(Cells(i, cFormulaCol).Value) Then Else GoTo 10
If Mid$(vFormula, 1&, 1&) = "=" Then
vFormula = Mid$(vFormula, 2&)
vFormula = "=IF(ISERROR(" & vFormula & "),0," & vFormula & ")"
Cells(i, cFormulaCol).Formula = vFormula
10
End If
Next i
Next cFormulaCol
End Sub
Автор: filemoto
Дата сообщения: 04.04.2007 12:46
AndVGri

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


Прикольная штука. Спасибо. Конечно пригодится

Автор: Farest
Дата сообщения: 04.04.2007 13:07
The okk,AndVGri
Если интересно можно посмотреть
http://upload2.net/page/download/Gcz4mGHv1vZ8wRw/%D0%E0%F1%F7%B8%F2++%F4%F3%F0%ED%E8%F2%F3%F0%FB+%ED%E0+AGS+%E4%E2%E5%F0%E8+1.xls.html
Автор: AndVGri
Дата сообщения: 04.04.2007 14:00
hackman
Держи, слепил функцию для проверки ячейки на
Цитата:
олько с ошыбками ДЕЛ/0


Код:
Public Function isDivisionByZero(ByVal inCell As Range) As Boolean
Const FuncName As String = "ERROR.TYPE("
Dim refName As String, Result As Boolean

Result = False
If inCell.Errors(xlEvaluateToError).Value Then
refName = inCell.Parent.Name & "!" & inCell.Address(ReferenceStyle:=xlR1C1)
If Application.ExecuteExcel4Macro(FuncName & refName & ")") = 2& Then Result = True
End If
isDivisionByZero = Result
End Function
Автор: SERGE_BLIZNUK
Дата сообщения: 04.04.2007 14:39
hackman
немного нечестно, но всё таки...
через
If Application.Evaluate("Error.Type(" & Cells(i, cFormulaCol).Address & ")") = 2
[more=полностью процедура]
Код: [no]
Public Sub AddIf_to_eror_formula()
Dim cFormulaCol As Integer
Dim i As Long, vFormula As String
Dim vFirst As Long, vLast As Long

col1 = ActiveSheet.UsedRange.Column
col2 = col1 + ActiveSheet.UsedRange.Columns.Count - 1&
For cFormulaCol = col1 To col2

vFirst = ActiveSheet.UsedRange.Row
vLast = vFirst + ActiveSheet.UsedRange.Rows.Count - 1&
For i = vFirst To vLast
vFormula = Trim$(Cells(i, cFormulaCol).Formula)
If (Application.WorksheetFunction.IsError(Cells(i, cFormulaCol).Value)) Then
If Application.Evaluate("Error.Type(" & Cells(i, cFormulaCol).Address & ")") = 2 Then
If Mid$(vFormula, 1&, 1&) = "=" Then
vFormula = Mid$(vFormula, 2&)
vFormula = "=IF(ISERROR(" & vFormula & "),0," & vFormula & ")"
Cells(i, cFormulaCol).Formula = vFormula
End If
End If
End If
Next i
Next cFormulaCol
End Sub
[/no]
Автор: cluster
Дата сообщения: 04.04.2007 21:18

Цитата:
Народ, подскажите, пожалуйста, код для календаря (Элемент управления Office 2003), чтоб при нажатии на число, соответсвующая дата появлалась в определенной ячейке. Или ссылочку, где это описывается. Спасибо.


Код: Private Sub Calendar1_Click()
Cells(5, 3).Value = Calendar1.Object
End Sub
Автор: jONES1979
Дата сообщения: 04.04.2007 22:12
cluster
вот посмотри попробуй http://slil.ru/24185693
В примере объект "Microsoft MonthView Control 6.0". Не знаю, его ли ты имел в виду.

p.s. только щас заметил. не в ту ячейку он в примерчике выводит дату. неуследил
Автор: cluster
Дата сообщения: 05.04.2007 13:00
jONES1979
аа, кул) пасиба, этот файлик помог. (способ №1) уже всё под себя подстроил.
Автор: evsino
Дата сообщения: 05.04.2007 20:17
помогите плиз
то ли глюк толи я неуч
записываю макрос открыть файл при открытом файле
а тамничего нет только window().activate
копирую ячейку из одной книги в другую вылетает то код9 то 1044 или еще что
у меня EXCEL 2003 sp2
может что не подключено переустановка ничего не дала
я ведь делаю самые простые действия ну железно должно работать а не работает
Автор: AndVGri
Дата сообщения: 06.04.2007 02:37
evsino

Цитата:
window().activate

вот такого быть не может. Может быть где-то так (приведите код, если не нужен ответ про где-то так)
Windows("Книга.xls:1").Activate
Автор: aks_sv
Дата сообщения: 06.04.2007 07:03
Подскажите, пожалуйста, что не так делаю?

Sub Макрос8()
Application.ScreenUpdating = False
Dim r As Long, LastRow As Long, s As Long, FinalRow As Long
LastRow = Worksheets("Ведомость").Range("E65536").End(xlUp).Row
FinalRow = Worksheets("Остаток").Range("A65536").End(xlUp).Row
For r = 10 To LastRow
If Worksheets("Ведомость").Cells(r, 5).Value > 0 _
And Worksheets("Ведомость").Cells(r + 2, 5).Value _
= Worksheets("Ведомость").Cells(r, 5).Value Then
For s = 1 To FinalRow
Worksheets("Остаток").Cells(s, 1).Value _
= Worksheets("Ведомость").Cells(r, 2).Value
Next s
End If
Next r

End Sub
Автор: AndVGri
Дата сообщения: 06.04.2007 07:25
aks_sv
А что тут делается? А в чём проблема?
Судя по коду - первый цикл по r должен быть до LastRow - 2, иначе Worksheets("Ведомость").Cells(r + 2, 5).Value будет уже вне диапазона данных от r = LastRow - 1.
Зачем во втором вложенном цикле присваивается одно и тоже значение Worksheets("Ведомость").Cells(r, 2).Value всему диапазону 1..FinalRow? А условие входа в этот цикл выполнится несколько раз - должен остаться последний проход? Не проще ли тогда в первом цикле найти последнее значение Worksheets("Ведомость").Cells(r, 2).Value, а только потом сделать цикл присвоения на листе "Остаток"?
Да и не забудьте вернуть Application.ScreenUpdating = True
Автор: aks_sv
Дата сообщения: 06.04.2007 07:57
AndVGri
У меня имеется таблица на листе "Ведомости":

B C D E

Болт М 16х55        403,39
             5,000
15.00006.03        403,39
             5,000
Болт М 6х25        216,10
             2,000
15.00004.03        216,10
             2,000
Болт М 6х40        324,15
             3,000
15.00005.03        324,15

В столбце В наименованию деталей соответствуют значения в столбце Е - цена а ниже количество. В столбце В ниже наименования через строчку индекс этой детали а в столбце Е повторяется цен и количество. Так вот мне необходимо получить на листе "Остаток" таблицу в следующем виде:

А В С

Болт М 16х55 403,39 5,000
Болт М 6х25 216,10 2,000 и т.д.
            
Автор: The okk
Дата сообщения: 06.04.2007 08:05

Код: Sub Macros8()
Dim xlInitialCalcState As XlCalculation
Dim Cell As Range, rngOstatok As Range
With Application
.ScreenUpdating = False
xlInitialCalcState = .Calculation
.Calculation = xlCalculationManual

Set rngOstatok = Worksheets("Остаток").Range(Cells(1, 1), _
Cells(Rows.Count, 1).End(xlUp))
For Each Cell In Worksheets("Ведомость").Range(Cells(10, 5), _
Cells(Rows.Count, 5).End(xlUp))
With Cell
If (.Value > 0) And (.Offset(2) = .Value) Then _
rngOstatok.Value = .Value
End With

Next Cell1
.Calculation = xlInitialCalcState
.ScreenUpdating = True
End With
End Sub
Автор: aks_sv
Дата сообщения: 06.04.2007 08:07
AndVGri

Что-то плохо таблица получилась:
В С D E
Болт М 16х55 403,39
5,000
15.00006.03 403,39
5,000
Болт М 6х25 216,10
2,000
15.00004.03 216,10
2,000
Болт М 6х40 324,15
3,000
15.00005.03 324,15
3,000

И еще : в столбце Е может находится промежуточная сумма всех деталей, которой не должно быть на листе "остаток"




Автор: The okk
Дата сообщения: 06.04.2007 08:16

Цитата:
В столбце В наименованию деталей соответствуют значения в столбце Е - цена а ниже количество. В столбце В ниже наименования через строчку индекс этой детали а в столбце Е повторяется цен и количество. Так вот мне необходимо получить на листе "Остаток" таблицу в следующем виде:

хм... давай с начала. Я так понял, нас интересуют только столбцы В и Е.
В столбце B чередуются названия и какие-то цифры. Строка - текст, строка - число?
В столбце E остаток. Если он больше нуля, то берем значение из B и переносим его в лист "Остаток" в столбец А, цифру, стоящую в столбце В в строчке под названием, пишем в лист "Остаток" в столбец С.
Так?
Как заполняется столбец В листа "Остаток"?
Автор: AndVGri
Дата сообщения: 06.04.2007 09:33
aks_sv
А Вы не могли бы выложить файл с примером на одном листе исходные данные (обязательно включая промежуточные итоги) и результирующий, а то так выяснять где, что находится можно долго?
Автор: Ergistael
Дата сообщения: 06.04.2007 12:02
Здравствуйте, посоветуйте, пожалуйста, как сделать, чтобы созданная кнопка становилась неактивной, если пользователь закрыл все книги, если выбран графический объект, а не группа ячеек и т.п., как это происходит с большинством встроенных меню Excel.
Автор: AndVGri
Дата сообщения: 06.04.2007 12:52
Ergistael
В самом Excel, скорее всего, никак. Дело в том, что кнопка панели инструментов не получает никаких событий от Excel. Можно создать класс, который будет отслеживать события Application (создав в нём переменную WithEvents FApp As Excel.Application) или других объектов и по созданным обработчикам пытаться выставить доступность требуемой кнопки панели. Но как инициализировать переменную этого класса? Можно написать собственную настройку в Excel, которая при загрузке инициализирует объект этого класса, но при нажатии кнопки Stop (например в VBE). Она сброситься и, соответственно, не будет работать обработчик событий приложения.
К тому же, не у Application, не у Workbook я не нашёл события, которое обрабатывало изменение выделения с ячеек на графический объект.
Возможно, нужно попробовать написать расширение в VB или где-то ещё, куда будет передаваться не уничтожаемая ссылка на Application, возможно там будет и более расширенная группа событий приложения. Пока не на чем попробовать, чтоб дать положительный ответ
Автор: Ergistael
Дата сообщения: 06.04.2007 13:06
AndVGri, спасибо, я понял, тогда, видимо, не буду заморачиваться. Просто поставлю проверку, что количество листов открытой книги не равно 0, а как поступить с проверкой, что выбран не графический объект? Какие вообще правила хорошего тона в оформлении процедур, чтобы отсечь большинство очевидных ошибок, связанных с запуском макросов в неподходящее время?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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