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

» Excel VBA (часть 2)

Автор: MrZeRo
Дата сообщения: 28.02.2008 12:47
AdUser

Цитата:

Selection.Autofilter

снимает/устанавливает автофильтр (аналог меню Данные-Фильтр-Автофильтр).
Автор: AndVGri
Дата сообщения: 28.02.2008 13:49
visual73
Потому что, RefEdit не входит в сборку MSForms. Он входит в сборку с аналогичным названием.
If TypeOf RfEd Is RefEdit.RefEdit Then
но, можно MSForms и RefEdit опускать. Использовать ссылку на сборку следует в том случае, если названия классов, перечислений, типов, констант имеют одинаковые названия в разных сборках. Напрммер, DAO и ADODB имеют класс Recordset, тогда и нужна ссылка на сборку.
Автор: visual73
Дата сообщения: 28.02.2008 14:00
AndVGri
Спасибо за разъяснения!
Я сейчас уж как не изгалялся и так пробовал
If TypeOf RfEd Is RefEdit Then
тоже выдает ошибку. А вот
If TypeOf RfEd Is RefEdit.RefEdit Then - самое оно!, работает!
Я уж, с такой трагедии, как альтернативу придумал так
If TypeName(RfEd) = "RefEdit" Then
Теперь есть два варианта
Автор: Heroic
Дата сообщения: 28.02.2008 14:02
Макрос суммы всех выделенных ячеек в Excel средствами VBA

Подскажите plz, как это сделать? Т.е. наделана куча выделений, не связанных между собой (т.е. через "Ctr"), как в нужную ячейку подставить их сумму?
Конструкция [a1] = WorksheetFunction.Sum(Selection) не устраивает, т.к. она суммирует выделенный диапазон, а когда курсор переставляется в место, где нужна эта сумма - выделение естественно слетает, и сумма становится равна нулю.
Может кто знает, как просуммировать выделение, уже скопированное в буфер по "Ctrl+Ins"?

Автор: ol7ca
Дата сообщения: 28.02.2008 16:17
AndVGri
SAS888

Очень благодарен вам за помощь!

Добавлено:
SAS888


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


с цветом я уже разобрался:

For i = 1 To .Cells(65536, 28).End(xlUp).Row
If Cells(i, 28).Interior.ColorIndex = 1 Then
Range(Cells(i, 2), Cells(i, 27)).Interior.ColorIndex = 1

а как то же сделать с рамкй?
пробывал так:

For i = 1 To .Cells(65536, 40).End(xlUp).Row
If Range(6, 40).Borders(xlEdgeRight) = True Then
With Cells(6, 10).Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = xlAutomatic

выдает ошибку
и она в проверке:

If Range(6, 40).Borders(xlEdgeRight) = True Then

как ни бьюсь - не могу правильно записать эту строчку

Автор: SAS888
Дата сообщения: 28.02.2008 17:20
Heroic
Можно так:

Код: Sub SumSelect()

Dim Summa As Double, Cell As Variant
For Each Cell In Selection
Summa = Summa + Cell
Next
MsgBox Summa

End Sub
Автор: ol7ca
Дата сообщения: 28.02.2008 17:59
SAS888

еще раз спасибо.

я извиняюсь за шквал вопросов, но у меня еще загвоздка:

Цитата:
что нужно сделать, чтобы в итоге не появлялись значения: #N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME?, #NULL!и им подобные?


я селал так:
For i = 1 To ActiveSheet.Cells(65536, 28).End(xlUp).Row
If IsNumeric(Cells(i, 28)) And Cells(i, 28) <> "" Then
On Error Resume Next
Cells(i, 2) = Cells(i, Stolb)
Cells(i, 3) = Cells(i, Stolb + Sdvig1)
Cells(i, 5) = Cells(i, Stolb + Sdvig2)
Cells(i, 12) = Application.Sum(Range(Cells(i, 28), Cells(i, Stolb)))
Cells(i, 13) = Application.Sum(Range(Cells(i, 28 + Sdvig1), Cells(i, Stolb + Sdvig1)))
Cells(i, 15) = Application.Sum(Range(Cells(i, 28 + Sdvig2), Cells(i, Stolb + Sdvig2)))

If Err <> 0 Then
Cells(i, 2) = 0
Cells(i, 3) = 0
Cells(i, 5) = 0
Cells(i, 12) = 0
Cells(i, 13) = 0
Cells(i, 15) = 0
Else

Cells(i, 2) = Cells(i, Stolb)
Cells(i, 3) = Cells(i, Stolb + Sdvig1)
Cells(i, 5) = Cells(i, Stolb + Sdvig2)
Cells(i, 12) = Application.Sum(Range(Cells(i, 28), Cells(i, Stolb)))
Cells(i, 13) = Application.Sum(Range(Cells(i, 28 + Sdvig1), Cells(i, Stolb + Sdvig1)))
Cells(i, 15) = Application.Sum(Range(Cells(i, 28 + Sdvig2), Cells(i, Stolb + Sdvig2)))
End If
End If

но ошибочные значения остались


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

Dim ws As Object, k As Integer, a
Dim i As Long, wb As Workbook
Application.ScreenUpdating = False
a = Array("S", "I", "X")
For k = 0 To UBound(a)
Set ws = Sheets(a(k))
With ws
For i = 1 To .Cells(65536, 28).End(xlUp).Row
If Cells(i, 28).Interior.ColorIndex = 1 Then
Range(Cells(i, 2), Cells(i, 27)).Interior.ColorIndex = 1
End If
Next i
End With
Next
End Sub
Автор: AndVGri
Дата сообщения: 29.02.2008 02:43
visual73

Цитата:
If TypeName(RfEd) = "RefEdit" Then

TypeName хорошо работает в Excel, но в общем случае, когда столкнетесь с интерфейсами это не пойдёт. Вы можете получить ссылку на объект через один интерфейс и TypeName вернёт его название. Но, допустим, вам необходимо проверить поддерживает ли объект другой интерфейс. В этом случае только TypeOf.
[more]
В VBA ArcMAP доступ к слоям карты осуществляется через
.FocusMap.Layer(i) возвращается интерфейс ILayer
но объекты-слои могут быть следующих типов: пространственные данные с атрибутами (IFeatureLayer); графические примитивы (IGraphicLayer); растры (IRasterLayer) и. т. д.
Если необходимо работать с пространственными данными, то код
If TypeName(.FocusMap.Layer(i)) = "IFeatureLayer" Then
никогда не позволит найти слой с пространственными данными
надеюсь понятно объяснил
[/more]
ol7ca

Цитата:
цикл работает только на ткущем листе и не переходит к остальным

Cells и Range должны быть указаны с соответствующим листом, при использовании With ws
.Cells(i, 28); .Range(.Cells(i,2), .Cells(i, 27)) или без With
ws.Cells(i, 28); ws.Range(ws.Cells(i,2), ws.Cells(i, 27))
Автор: SAS888
Дата сообщения: 29.02.2008 04:56
ol7ca
Поясните, как, например, оператор

Код: Cells(i, 2) = Cells(i, Stolb)
Автор: ol7ca
Дата сообщения: 29.02.2008 20:46
SAS888

Цитата:
Поясните, как, например, оператор
Код:Cells(i, 2) = Cells(i, Stolb)
может выдавать ошибку?


когда в Cells(i, Stolb) находится значение #N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME?, #NULL!
тогда это значение и будет результатом Cells(i, 2)
это как раз мой случай
и я хочу избавиться от этих значений в результирующем столбце
Автор: AndVGri
Дата сообщения: 01.03.2008 02:43
ol7ca
Используй для проверки наличия ошибки в ячейке
Application.WorksheetFunction.IsErr(Cells(i, Stolb))
или
Application.WorksheetFunction.IsError(Cells(i, Stolb))
или аналогичные
Автор: fwevilfather
Дата сообщения: 02.03.2008 16:55
помогите доделать скрипт
имеется таблица с колонкой типа:
DVD-плеер Dex DVP-131black
DVD-плеер Dex DVP-131silver
DVD-плеер LG DGK-777
DVD-плеер LG DKU-860
DVD-плеер Panasonic DVD-S2EE-S
DVD-плеер Panasonic DVD-S53EE-S

как преобразовать эту колонку в такой вид:

!!DEX
DVD-плеер Dex DVP-131black
DVD-плеер Dex DVP-131silver
!!LG
DVD-плеер LG DGK-777
DVD-плеер LG DKU-860
!!Panasonic
DVD-плеер Panasonic DVD-S2EE-S
DVD-плеер Panasonic DVD-S53EE-S

заранее спасибо

з.ы. файлы формата CSV. количество строк в этой колонке всегда разное.
Автор: abasov
Дата сообщения: 03.03.2008 08:51
В условном форматировании формирую значения по совпадению в строках:

=И(СЧЁТЕСЛИ($A$1:$A$100; A1)+СЧЁТЕСЛИ($B$1:$B$100; A1)>1;НЕ(ЕПУСТО(A1)))

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

Автор: Password Login
Дата сообщения: 03.03.2008 09:18
Здравствуйте.
Вопрос такой. Возможно ли в VBA сделать так, чтобы переменные сохраняли своё значение не только во время работы кода, но и при закрытии рабочей книги. То есть при следующем открытии этой книги переменные "вспоминали" свои значения, присвоенные им с прошлого раза. Если объявить их статическими, то они при закрытии книги, думаю, обнулятся (Variables declared with the Static statement retain their values as long as the code is running).
Конкретный пример:
Создаю модуль класса "ClsEmp". То есть работники (со своими свойствами, такими, как, например, явка или неявка на работу в какой-то определённый день, и, соответственно, методами).
Создаю коллекцию "Employees". То есть опять-таки работники.
Заполняю коллекцию объектами "Employee". То есть снова-таки работниками.
Пока идёт месяц, один работник вдруг не явился на работу. Я ставлю ему, допустим, прогул. То есть переменная (например, "Day4") должна иметь значение "ПР". И эта переменная должна по крайней мере весь месяц сохранять это значение, сколько раз я бы ни открывал эту рабочую книгу.
Как это сделать?
Заранее благодарен.
Автор: SAS888
Дата сообщения: 03.03.2008 10:27
Password Login
А что? Сохранять на рабочем листе (или в скрытой области, или на отдельном) нельзя?
Автор: visual73
Дата сообщения: 03.03.2008 11:05
AndVGri

Цитата:
TypeName хорошо работает в Excel

В общих чертах я понял. Спасибо.
Автор: duck777
Дата сообщения: 03.03.2008 12:20
Здравствуйте!!!
Вопрос и простой и сложный (для меня по крайней мере).
Как в макросе перейти на первую ячейку строки на которой находится курсор???

SendKeys "{HOME}" НЕ РАБОТАЕТ, почему-то...

Заранее благодарен.
Автор: Password Login
Дата сообщения: 03.03.2008 12:32
И ещё один вопрос.
Помогите создать код индикатора хода процесса.
Имеется код, который создаёт рабочий лист в книге Эксель, форматирует его, заполняет данными, и т. д. Весь этот процесс занимает порядка полутора минут.
Так вот, для пущей эстетичности работы кода хотел бы, чтобы во время его работы выплывало окошечко с полоской, которая наглядно показывает ход процесса, как и почти во всех приложениях Виндуса. ProgressBar, это наверное, оно.
Помогите, пожалуйста!
Автор: SAS888
Дата сообщения: 03.03.2008 13:09
duck777
Можно, например, так:

Код: Cells(ActiveCell.Row, 1).Select
Автор: duck777
Дата сообщения: 03.03.2008 13:20
SAS888

Огромное спасибо, заработало!!!

Век живи - два века учись...

МОжет кто подскажет ссылочку на ТОЛКОВОЕ описание VBA для Excell ???
Автор: ebrr
Дата сообщения: 03.03.2008 14:14
Нашел в книге "Трюки и эффекты excel" пример простого калькулятора:

Sub simpleCalculator()
On Error GoTo errors

Dim strExpr As String
strExpr = InputBox("Под рукой нет калькулятора? Тогда вводите выражение в виде: 2+2*15/3*3-4+(5-2)/2 и нажмите Enter или OK", "Калькулятор")
MsgBox strExpr & "=" & Application.Evaluate(strExpr)


errors:
End Sub

Подскажите пожалуйста как можно сделать так чтобы ответ выводился рядом сразу же в процессе введения выражения. Т.е. чтобы рядом с знаком = сразу же при введении 2+2 выводилось 4, и если пользователь продолжить вводит выражения (например 2+2*7-1 и т.д.), то ответ должен считаться автоматически без нажатия на ОК или Enter. Попытался создать пользовательскую форму в виде: ВЫРАЖЕНИЕ=АВТОМАТИЧЕСКИЙ ОТВЕТ но так как знаний пока не хватает обращаюсь к профи.
Буду признателен за любую помощь.
Автор: Mint86
Дата сообщения: 03.03.2008 14:26
Password Login

Цитата:
И ещё один вопрос.
Помогите создать код индикатора хода процесса.


Может это поможет http://dimit.pochta.ru/wopr.html
Автор: fwevilfather
Дата сообщения: 03.03.2008 14:54
помогите доделать скрипт
имеется таблица с колонкой типа:
DVD-плеер Dex DVP-131black
DVD-плеер Dex DVP-131silver
DVD-плеер LG DGK-777
DVD-плеер LG DKU-860
DVD-плеер Panasonic DVD-S2EE-S
DVD-плеер Panasonic DVD-S53EE-S

как преобразовать эту колонку в такой вид:

!!DEX
DVD-плеер Dex DVP-131black
DVD-плеер Dex DVP-131silver
!!LG
DVD-плеер LG DGK-777
DVD-плеер LG DKU-860
!!Panasonic
DVD-плеер Panasonic DVD-S2EE-S
DVD-плеер Panasonic DVD-S53EE-S

заранее спасибо

з.ы. файлы формата CSV. количество строк в этой колонке всегда разное.
Автор: visual73
Дата сообщения: 03.03.2008 15:42
fwevilfather

Цитата:
помогите доделать скрипт

а покажите что уже сделано, чтобы можно было "доделать"?
По моему легче Найти "DVD-плеер " и Заменить на "". А потом через Access сделать такой отчет.
Автор: alekceur
Дата сообщения: 03.03.2008 16:17
Кто подскажет
в запросах к mysql через ODBC , например
SELECT * FROM `database`.'table' where data<20080229
нужно чтобы число 20080229 бралось из ячейки на листе
Автор: DocBeen
Дата сообщения: 03.03.2008 18:59
Ребята выручайте имеется такая таблица:

1    ШАНАУРОВ ВИТАЛИЙ ВАСИЛЬЕВИЧ    10
1    ШАНАУРОВ ВИТАЛИЙ ВАСИЛЬЕВИЧ    100
1    ШАНАУРОВ ВИТАЛИЙ ВАСИЛЬЕВИЧ    201,2
1    ШАНАУРОВ ВИТАЛИЙ ВАСИЛЬЕВИЧ    3197,35
2    ГАЛЛЯМОВА ТАМАРА ФЕДОРОВНА    3243,1
2    ГАЛЛЯМОВА ТАМАРА ФЕДОРОВНА    3243,1
2    ГАЛЛЯМОВА ТАМАРА ФЕДОРОВНА    3243,1
3    ТИХОНОВА МАРИНА АЛЕКСАНДРОВНА    3764,01
4    ОСОКИНА ТАТЬЯНА ВАСИЛЬЕВНА    2722,61
5    БАКАЙ РЕЗЕДА МАРАТОВНА     2922,23


надо из нее сделать:
1    ШАНАУРОВ ВИТАЛИЙ ВАСИЛЬЕВИЧ    3508,55
2    ГАЛЛЯМОВА ТАМАРА ФЕДОРОВНА    9729,3
3    ТИХОНОВА МАРИНА АЛЕКСАНДРОВНА    3764,01
4    ОСОКИНА ТАТЬЯНА ВАСИЛЬЕВНА    2722,61
5    БАКАЙ РЕЗЕДА МАРАТОВНА     2922,23

Так вот посоветовали с помощью оператора For все это дело обработать,
а я не могу додумать как...

Как мне в цикл ввести значение равное количеству строк в таблице ( в примере их немного, а в идеале их будет около 20000)

Помогите пожалуйста...
Автор: fwevilfather
Дата сообщения: 03.03.2008 19:28

Цитата:
а покажите что уже сделано, чтобы можно было "доделать"?
По моему легче Найти "DVD-плеер " и Заменить на "". А потом через Access сделать такой отчет.


все, я уже сам разобрался
всем спасибо



Добавлено:
форум учит думать самому
всем, кто не писал ответы, спасибо
Автор: crotoff
Дата сообщения: 03.03.2008 22:21
DocBeen
это же можно на уровне сводной таблицы элементарно реализовать
http://rapidshare.com/files/96811986/pivot.xls.html

Автор: SAS888
Дата сообщения: 04.03.2008 04:17
DocBeen
Если "в лоб", то можно так:
Пусть в столбце "A" - номер, в столбце "B" - ФИО, в столбце "C" - сумма. Тогда:

Код: Sub Main()

Dim i As Long, q As Long, LastR As Long
LastR = Cells(Columns("A").Rows.Count, "A").End(xlUp).Row ' Это номер последней строки в столбце "A"
i = 1
q = 2
Do While i < LastR
Do While q < LastR
Loop10: If Cells(i, "A") = Cells(q, "A") Then
Cells(i, "C") = Cells(i, "C") + Cells(q, "C")
Rows(q).Delete
LastR = LastR - 1
GoTo Loop10
End If
q = q + 1
Loop
i = i + 1
q = i + 1
Loop

End Sub
Автор: kartav
Дата сообщения: 04.03.2008 04:24
Очень прошу помочь! Эксел знаю хорошо, но вот с программированием совсем не знакома, а тут на работе возникла проблемка, и без VBA никак не обойтись!

Короче, есть куча файлов FILEi, где i=1,2,...115. В каждом из них таблица одинаковой размерности с разными значениями в соответствующих ячейках. Нужно сделать в файле FILEend суммарную таблицу той же размерности, что и все эти таблицы, где в каждой ячейке будет СУММА значений ячеек всех исходных таблиц. Т.е. в ячейке С10 в файле FILEend будет сумма значений ячеек С10 всех файлов.

Мне кажется, это должен быть простой какой-то цикл. Очень прошу помочь!

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

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


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