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

» Excel VBA

Автор: Yuk
Дата сообщения: 06.09.2006 23:25
ZORRO2005
В функции RemoveDuplicates подставь UCase или LCase:
Private Sub RemoveDuplicates(ByRef a As Variant)
...
For i = LBound(a) To UBound(a) - 1
If UCase(a(i)) <> UCase(a(i + 1)) Then
...
Автор: tarrac
Дата сообщения: 07.09.2006 09:41

Цитата:

Определить число используемых рядов:
nr = ActiveSheet.UsedRange.Rows.Count

Прыгаем вверх до последней заполненной ячейки:
lastrow = Cells(nr,col).End(xlDown).Row
где col - номер нужного столбца

вот так правильнее
Автор: Troitsky
Дата сообщения: 07.09.2006 10:07
Lyubaha

Цитата:
Спасибо большое, я прекрасно понимаю, что можно и без VBA... Но суть проблемы в следующем: для ячеек
H104=КОРЕНЬ(ДИСП(F4:F104))
H105=КОРЕНЬ(ДИСП(F5:F105))
H106=КОРЕНЬ(ДИСП(F6:F106))
H107=КОРЕНЬ(ДИСП(F7:F107))
H108=КОРЕНЬ(ДИСП(F8:F108))
и т.д.

Нужно написать макрос, чтобы это все считалось автоматом. Потому что интервал дисперсии часто приходится менять. Т. е. он может быть равен 100, 250, 255...

Зачем заниматься ерундой и лепить макросы там, где прекрасно можно обойтись без них? Вводишь значение интервала дисперсии в отдельную ячейку, например, А1 и записываешь такую формулу с последущим ее растягиванием по всему столбцу

Код: H104=КОРЕНЬ(ДИСП(F104:СМЕЩ(F104;-$A$1;0)))
Автор: ZORRO2005
Дата сообщения: 07.09.2006 10:52
Yuk

Я поменял
If a(i) <> a(i + 1) Then
на
If UCase(a(i)) <> UCase(a(i + 1)) Then
но все также осталось

На 1 листе у меня: Bunker 001
Bunker 002
Convers 005

На 2 листе у меня: BUNKER 001
CONVERS 005

На 3 листе у меня: BUNKER 002
CONVERS 006

Мне нужно в итоге:Bunker 001
Bunker 002
Convers 005
CONVERS 006


И в конце опять отсортировать по алфавиту.
Автор: Anton T
Дата сообщения: 07.09.2006 12:35
Yuk
Из файла надстройки.

Цитата:
Либо прописывай имя листа, либо не используй ThisWorkbook

Понял, побробую.

Добавлено:
Надстрйки который создан в файле Сохранить как... и тип файла: Надстройка MS Excel
Автор: sheinfain
Дата сообщения: 07.09.2006 16:57
Привет!
I need a help!!!
у меня возникла проблема с испрользованием функции вычисления медианыы в Excel. А точнее, я не знаю, как правильно её использовать для диапазона, а результаты записать в другой обозначенный диапазон! Заранее благодарю, если кто поможет!!!
Автор: Yuk
Дата сообщения: 07.09.2006 17:55
ZORRO2005
Измени тo же в функции SortArray:
If UCase(a(i)) > UCase(a(j)) Then

Выбор между строчными и прописными символами не гарантируется. Надо пересматривать алгоритм (PITA).

sheinfain
В чем проблема-то?
=МЕДИАНА(A1:A10)
Такие вопросы в Excel FAQ.
Автор: utmpatpc
Дата сообщения: 07.09.2006 17:57
Yuk
Работает!!! Все отлично! Спасибо! С меня бутылка помидор.
И теперь не к чему стремиться )
Начну наверно изучать программирование в VBA
Автор: ZORRO2005
Дата сообщения: 07.09.2006 19:31
Yuk
Спасибо огромное,все получилось
Автор: Yuk
Дата сообщения: 07.09.2006 19:45
ZORRO2005
Оказалось выбор между строчными и прописными символами не так сложно.
Опять же в SortArray:

Код: If UCase(a(i)) > UCase(a(j)) Then 'change to < for descending order
t = a(i)
a(i) = a(j)
a(j) = t
ElseIf UCase(a(i)) = UCase(a(j)) And a(i) < a(j) Then 'change to > to prefer upper case
t = a(i)
a(i) = a(j)
a(j) = t
End If
Автор: ZORRO2005
Дата сообщения: 07.09.2006 20:57
Yuk

Цитата:
Оказалось выбор между строчными и прописными символами не так сложно.

что то выдает ошибку
Автор: Yuk
Дата сообщения: 07.09.2006 22:02
ZORRO2005
Вот вся функция [more=SortArray]
Код: Private Sub SortArray(ByRef a As Variant)
Dim i As Long, j As Long
Dim t As Variant

'standard bubble sort loops
For i = LBound(a) To UBound(a) - 1
For j = i + 1 To UBound(a)
If UCase(a(i)) > UCase(a(j)) Then 'change to < for descending order
t = a(i)
a(i) = a(j)
a(j) = t
ElseIf UCase(a(i)) = UCase(a(j)) And a(i) < a(j) Then 'change to > to prefer upper case
t = a(i)
a(i) = a(j)
a(j) = t
End If
Next j
Next i
End Sub
Автор: filmax
Дата сообщения: 08.09.2006 12:09
Как (например для команды FileCopy) указать путь к файлу по сети?
комп в сетке - Tb2
такой путь не срабатывает "\\Tb2\Мои документы\Документы в работе\2006\Сентябрь 2006.xls"
и такой путь не срабатывает "file:///\\Tb2\Мои документы\Документы в работе\2006\Сентябрь 2006.xls"

__________________________________________________________________________
через подключение к букве диска... при входе... не устраивает
компы включаются в разное время... часто при включении отсутствует доступ к файлу.
Автор: Anton T
Дата сообщения: 08.09.2006 12:43
Yuk
Убрал ThisWorkbook и все заработало. Спасибо еще раз!
Автор: DONRU1
Дата сообщения: 08.09.2006 17:59
Yuk
извиняюсь за назойливость. Я вроде как разобрался в своей задаче и программа работает, но вот только результат не тот выдает (
Может глянешь?

Dim CRCTAB_16(0 To 256) As Integer
Dim iLen As Long
Dim btArr() As Byte
Dim iPrevSumm As Long

Sub testr()
Dim i As Integer
Dim TypeConv As Integer
TypeConv = 128
btArr = StrConv("100/46823/0021004682324.03.200524.03.2005950004001Яковлева Е. П.Антонова О. В.10001151005000213310100001000000100011510000100001000010000100100310004061972622899000010000001001003289900001000028990000100002900000029000000", TypeConv)
iLen = UBound(btArr)
For i = 0 To UBound(CRCTAB_16)
CRCTAB_16(i) = CRCTAB_16(i) And &HFFFF&
'Workbooks("Baze.xls").Worksheets("реквизиты").Cells(i + 3, 25) = CRCTAB_16(i)
Next i
ddd = calcCRC16(iPrevSumm, btArr(), iLen)
MsgBox ddd
End Sub

Public Function calcCRC16(ByVal iPrevSumm As Long, ByRef btArr() As Byte, ByVal iLen As Long) As Long
Dim i As Long
For i = 0 To iLen
iPrevSumm = CLng(CRCTAB_16((((iPrevSumm \ 256)) And &HFF)) Xor ((iPrevSumm And &HFF) * 256) Xor (btArr(i))) And &HFFFF
Next i
calcCRC16 = iPrevSumm
End Function
Автор: Yuk
Дата сообщения: 08.09.2006 20:57
DONRU1
Во-первых, нет инициализации массива CRCTAB_16, все его члены равны 0.
Во-вторых, не понятно для чего нужна обработка этого массива:
CRCTAB_16(i) = CRCTAB_16(i) And &HFFFF&
Я понимаю, что эта операция делает, но значения массива при этом не меняются.
Автор: DONRU1
Дата сообщения: 09.09.2006 20:21
Yuk
Простите меня за мою безграмотность, но работа с массивами всегда была мом слабым местом, что значит "Инициализация массива" Каким образом ее правильно провести. Пытаюсь задать CRCTAB_16 через Array, так VBA сразу ругается на первый же элемент массива. Черз цикл for next тоже.
Автор: Yuk
Дата сообщения: 09.09.2006 22:48
DONRU1
Глядя на этот твой код, массив CRCTAB_16 должен быть Long или динамический Variant (так возможно будет проще).

Код: Dim CRCTAB_16(0 To 255) As Long
Автор: DONRU1
Дата сообщения: 10.09.2006 23:22
Yuk
правильный ответ = 59977
Автор: DONRU1
Дата сообщения: 11.09.2006 12:31
Yuk
Спасибо за подсказку. После того как заменил 0x на &H все получилось, и в том и другои варианте.
Автор: SERGE_BLIZNUK
Дата сообщения: 12.09.2006 16:09
отвечаю господину dimasfera

вопрос:

Цитата:
в Экселе менять заглавные буквы на прописные и обратно выделяя просто весь столбец.


на ваш вопрос по VBA отвечу там, где положено ;-)))))

в Excel нажмите Alt-F11 (Visual Basic) - в редакторе слева двойной щелчек по вашему листу
появится форма ввода скрипта:

Код:
Sub All_Selected_Strings_to_Lower()
For Each c In Selection
Cur_Cell_Type = TypeName(c.Value)
If Cur_Cell_Type = "String" Then
c.Value = LCase(c.Value)
End If
Next
End Sub
Автор: skotov
Дата сообщения: 12.09.2006 16:56
Подскажите, пожалуйста, как сделать так, чтобы в существующей диаграмме в качестве параметров .MinimumScale и .MaximumScale можно было использовать значения ячеек (скажем A1 и A2)?

Задача заключается в том, чтобы после исполнения макроса шкала на графике менялась в соответствии с полученными результатами. Спасибо
Автор: Yuk
Дата сообщения: 12.09.2006 18:56
skotov
В макрос:
ActiveChart.Axes(2).MinimumScale = Range("A1").Value
Можно, например, также определить минимум:
ActiveChart.Axes(2).MinimumScale = WorksheetFunction.Min(Range("a1:a5"))
Для .MaximumScale аналогично.

Не надо постить в несколько топиков. Если вопрос по VBA, то в этот топик, если нет или пока не ясно, в FAQ. Я лично просматриваю оба.
Автор: skotov
Дата сообщения: 12.09.2006 19:48
Yuk
Делаю так и получаю ошибку "Run-time error 1004 невозможно получить свойство ChartObjects класса Worksheet"
Пишу так

Код: ActiveSheet.ChartObjects("Диагр. 8").Activate
ActiveChart.Axes(xlValue).Select
With ActiveChart.Axes(xlValue)
.MinimumScale = Range("J28").Value
.MaximumScale = Range("K29").Value
.MinorUnitIsAuto = True
.MajorUnitIsAuto = True
.Crosses = xlAutomatic
.ReversePlotOrder = False
.ScaleType = xlLinear
.DisplayUnit = xlNone
End With
Автор: Yuk
Дата сообщения: 12.09.2006 21:37
skotov
Может имя ChartObject не правильное.
Сравни:
Debug.Print ActiveChart.Name
Debug.Print ActiveChart.Parent.Name
Во втором случае как раз выведется имя ChartObject
Автор: skotov
Дата сообщения: 13.09.2006 09:22
Yuk
Имя правильное - специально сначала записал макрос.
Видимо туда можно вводить только число.. (( Может как-то еще можно попробовать?
Автор: SERGE_BLIZNUK
Дата сообщения: 13.09.2006 10:21
skotov

Цитата:
Видимо туда можно вводить только число..

сорри, что вмешиваюсь в ваше обсуждение.
проверь, когда там в присвоении указана не ячейка, а конкретное число - ошибки нет???
тогда твое предположение верно, и значение ячейки нельзя присваивать.
Но это вряд ли. скорее всего ошибка в другом - либо не тот объект(имя не то), либо свойство не то, либо оно вообще readonly...
Автор: MoKC0DeR
Дата сообщения: 13.09.2006 11:10
Не удаляется toolbar

Код: Private Sub Workbook_AddinUninstall()
Application.CommandBars("my_tb").Delete
End Sub
Автор: skotov
Дата сообщения: 13.09.2006 11:44
SERGE_BLIZNUK
Yuk
Попробовал просто записать и запустить макрос - та же ошибка. Застривает на строке
ActiveSheet.ChartObjects("Диагр. 8").Activate

Проблема оказалась в названии диаграммы - заменил Диагр. на Chart и все получилось.

Всем спасибо за помощь!
Автор: Funt123
Дата сообщения: 13.09.2006 14:00
Ситуация следующая:
Есть ряд переменных: StepPrice_n1, StepPrice_n2, ... StepPrice_nn со своими числовыми значениями.
И через цикл я приравниваю значения этих переменных другим переменным:

for i=1 to n
curStepPrice_i = "StepPrice_n" & i
next n

И вот не могу понять как это сделать, поскольку curStepPrice_i получают в качестве значения "StepPrice_ni", а не значения данных переменных.
Помогите пожалуйста.

Добавлено:
Смотрите еще какой глюк обнаружил:
Забил в первую ячейку число(без кавычек) "10,8", ниже "10,6", потянул _вниз_ и вот что получилось:
10,800000000000000000000000000000
10,600000000000000000000000000000
10,400000000000000000000000000000
10,200000000000000000000000000000
10,000000000000000000000000000000
9,799999999999990000000000000000
9,599999999999990000000000000000
9,399999999999990000000000000000
9,199999999999990000000000000000
8,999999999999990000000000000000
8,799999999999990000000000000000

Если потянуть изначально _вверх_, то без девяток, но если потянуть _вверх_ поменяв предварительно местами первые два числа, то опять появяться девятки:
8,799999999999990000000000000000
8,999999999999990000000000000000
9,199999999999990000000000000000
9,399999999999990000000000000000
9,599999999999990000000000000000
9,800000000000000000000000000000
10,000000000000000000000000000000
10,200000000000000000000000000000
10,400000000000000000000000000000
10,600000000000000000000000000000
10,800000000000000000000000000000

Как от этого избавиться?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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