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

» Excel VBA (часть 3)

Автор: vlth
Дата сообщения: 21.02.2010 13:55
NJCorp

Цитата:
Подскажите плз кодик для написания Фамилии Имени и По-батюшки с большой букви.
Ето один текстбокс. Ну и запрет двойного пробела.


Код: Private Sub TextBox1_AfterUpdate()
Dim aText() As String, strText As String, i As Byte

strText = Trim(TextBox1.Text)
Do While InStr(1, strText, " ") > 0
strText = Replace(strText, " ", " ")
Loop
aText = Split(strText)
For i = 0 To UBound(aText)
aText(i) = UCase(Left(aText(i), 1)) & _
LCase(Right(aText(i), Len(aText(i)) - 1))
Next i
Me.TextBox1 = Join(aText)
End Sub
Автор: NJCorp
Дата сообщения: 22.02.2010 03:06
dneprcomp
PROPER ет я так понимаю ПРОПНАЧ на руском
ето оно, но мне нужно в ВБА

vlth
Спасибо, то что нужно.
(там кажись и негде ошибиться )
Автор: dneprcomp
Дата сообщения: 22.02.2010 03:37
NJCorp
Уж не знаю, как оно там на русском, но Proper это функция VBA Excel. Точно такая как и Lower или Upper.
Автор: vlth
Дата сообщения: 22.02.2010 09:59
NJCorp

Цитата:
там кажись и негде ошибиться

А если, скажем, содержимое текстбокса будет удалено? - вот и первая ошибка.

Цитата:
dneprcomp
PROPER ет я так понимаю ПРОПНАЧ на руском
ето оно, но мне нужно в ВБА
Имеется в виду
Код: strText = Application.WorksheetFunction.Proper(strText)
Автор: NJCorp
Дата сообщения: 22.02.2010 22:03

Цитата:
А если, скажем, содержимое текстбокса будет удалено? - вот и первая ошибка.

Ну в моем случае ето не грозит, у меня проверять надо не только етот ткестбокс, я проверяю MouseMove кнопки записи даних.


Код: Me.TextBox1 = Application.WorksheetFunction.Proper(strText)
Автор: crotoff
Дата сообщения: 24.02.2010 10:54
Excel 2007: напомните битте как в макросе определить самую нижнюю строчку в БД. В полях присутствуют пустые элементы, заранее кол-во строк неизвестно - данные экспортируются из SAP
Автор: ZlydenGL
Дата сообщения: 24.02.2010 10:55

Код: Cells.SpecialCells(xlCellTypeLastCell).Row
Автор: crotoff
Дата сообщения: 24.02.2010 10:58
В БД 87 полей: в 88й и 89й столбцы хочу вставить формулы с ВПР(), если вставить до конца листа - формулы слишком долго пересчитываются; нужно найти № самой последней строки
Автор: ZlydenGL
Дата сообщения: 24.02.2010 11:03

Код: Range(Cells(1, 88), Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 88)).FormulaR1C1 =
Автор: crotoff
Дата сообщения: 24.02.2010 11:20
ZlydenGL
спасибо, получилось
Range("ck2", Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 89)).FormulaR1C1 = "=VLOOKUP(RC[-88],'бла-бла'!C1:C3,3,0)"
Автор: zerbino
Дата сообщения: 27.02.2010 13:13
Приветствую! Намедни пришлось искать решение одной проблемы. Решение в рунете я не нашел, но повезло найти на нерусском источнике. Итак:

Допустим все ссылки ведут на сайт и исходный путь такой начинается с "http://www.site.ru/catalogue/" с папками внутри, а надо сделать, чтобы в итоге, как вариант, ссылка, например, вела на локальный каталог, который находится в той же папке, что и xls файл и имеет такую же структуру, что и в первичном источнике.

=============================================================
замена текста гиперссылки с отображением пути в ячейке на странице:
=============================================================
Sub ReplaceHyperlinks()
Dim h As Hyperlink
Dim intWrksheets As Integer

Const OLD_PATH = "http://www.site.ru/catalogue/" 'Старый путь:: Должно заканчиваться обратным слэшем

Const NEW_PATH = "catalogue/" 'Поменять на то, чем нужно заменить:: Должно заканчиваться обратным слэшем

For intWrksheets = 1 To ActiveWorkbook.Worksheets.Count 'для каждого листа в книге
For Each h In Worksheets(intWrksheets).Hyperlinks 'для каждой гиперссылки в листе
h.Address = Replace(h.Address, OLD_PATH, NEW_PATH, 1, 1)
h.TextToDisplay = Replace(h.Address, OLD_PATH, NEW_PATH, 1, 1)
Next
Next

End Sub
=============================================================
и второй вариант, без замены отображаемого текста гиперссылки в ячейке
=============================================================
Sub ReplaceHyperlinks()
Dim h As Hyperlink
Dim intWrksheets As Integer

Const OLD_PATH = "http://www.site.ru/catalogue/" ':: MUST END IN BACKSLASH

Const NEW_PATH = "catalogue/" 'Change as required:: MUST END IN BACKSLASH

For intWrksheets = 1 To ActiveWorkbook.Worksheets.Count 'for every sheet in the workbook
For Each h In Worksheets(intWrksheets).Hyperlinks 'for every hyperlink in the sheet
h.Address = Replace(h.Address, OLD_PATH, NEW_PATH, 1, 1)
Next
Next

End Sub
=============================================================
Пользуйтесь)

Например если вначале все ссылки вели на
"http://www.site.ru/catalogue/folder1/pic.jpg"
"http://www.site.ru/catalogue/folder2/pic2.jpg" и т.д.,
то после выполнения указанного скрипта ссылки будут вести на
"<Локальный путь до папки, где лежит xls файл+>/catalogue/folder1/pic.jpg"
"<Локальный путь до папки, где лежит xls файл+>/catalogue/folder2/pic2.jpg" и т.д
пути можно, конечно, заменять на любые другие, т.е. не локальные в т.ч.
Автор: Kirov23
Дата сообщения: 01.03.2010 12:14
Здравствуйте, подскажите пожалуйста. Как отнять несколько процентов от отдельной колонки? Спасибо!
Автор: randomar
Дата сообщения: 01.03.2010 23:04
Подскажите пожалуйста одну маленькую задачку по VBA...
Определить, пересечёт ли прямая ax+by+c=0 a)ось 0х, б)ось 0у.
з.ы.Всё надо в одном алгоритме. Зарание благодарен
Автор: Maximus777
Дата сообщения: 02.03.2010 12:04
Помогите плиз. Как можно привязать функцию к контролу, который создаётся в runtime? Т.е. на форме, в процессе выполнения, создаётся ListView с чекбоксами. Дык вот как организовать функцию Item_Check?
Автор: TimoXa_Skot
Дата сообщения: 02.03.2010 15:59
randomar
Пересечение с осью ОХ это y=0
Пересечение с осью ОY это x=0

If y=c/b or x=c/a then Msgbox("График пересечет оси координат")

Добавлено:
Kirov23
если в VBA
выделяем нужный диапазон и выполняем макрос:

Dim k ' Нужный процент
For Each sw In Selection
f = f + sw*k
Next
Range("нужная ячейка").Select
ActiveCell.FormulaR1C1 = f

Макрос сложит колонку и выведет результат в нужную ячейку
Автор: FlashBack
Дата сообщения: 03.03.2010 09:25
посдкажите пожалуйста, как лучше сделать следующее,
есть документ в нем куча листов, этой прайс, все столбцы на всех листах одной ширины,
с верху в шапке картинка jpg на всю ширину прайса с объеденеными ячеиками.

Задача такая надо удалить однин столбик H на всех листах (с этим я справился) выделил все листы и удалил столбик), но теперь надо выровнять оставшиеся столбцы под размер шапки, я беру выделяю все листы и один столбик увеличиваю в ширине чтоб вся таблица сравнялась с шапкой, на этом листе все нормально, но на остальных в книге, вместе с столбцом увеличивается и шапка, в этом то и есть проблема, приходиться потом вручную на каждом листе сбрасывать настройки картинки в шапке.

Пробовал макросы, но ничего не выходит - выскакивают ошибки, удаляет все с листа.

Помогите пожалуйста, может есть скрипт какой?.
Автор: NJCorp
Дата сообщения: 03.03.2010 10:52
Может сначала виставь ширину таблици, а потом вставляй рисунок.
Автор: Johnson Finger
Дата сообщения: 03.03.2010 22:03
Господа, подскажите по следующей проблемке. есть файлик с неким макросом, когда запускаю его у себя (макрос) обычно в произвольном месте выскакивает сообщение "Code execution has been interupted" и предлагает стандартное окно с дебагом, продолжением и т.д. Если нажать "Продолжить", вылезет это окно еще раз и дальше все норм. Что интересно, если этот же файл запускать на другой машие (версии офиса одинаковые), все работает прекрасно. Различается только система - там где все работает, русская ХР, где спотыкается Английская версия 2003-го сервера. раньше подобных проблем не наблюдал. Причем если шагать по коду (F8), то никаких окошек не вылазеет в принципе. Или иногда вообще также все работает. Короче зависимости я никакой не заметил.

И вопрос номер два, есть конструкция вида:

For Each Pattern In Range(Cells(1, 3), Cells(100, 3))

"тут код, который что-то делает"

Next

Собственно вопрос, можно ли как-то сделать так, чтобы когда в моменте "тут код, который что-то делает", когда выполняется некое условие и мы доходим до Next, следующий экземпляр "Pattern" брался не следующий по порядку, а например, через 10 следующих экземпляров?
Автор: vlth
Дата сообщения: 04.03.2010 09:41
Johnson Finger

Цитата:
For Each Pattern In Range(Cells(1, 3), Cells(100, 3))

"тут код, который что-то делает"

Next

Собственно вопрос, можно ли как-то сделать так, чтобы когда в моменте "тут код, который что-то делает", когда выполняется некое условие и мы доходим до Next, следующий экземпляр "Pattern" брался не следующий по порядку, а например, через 10 следующих экземпляров?

Нет, нельзя. Даже адрес следующего диапазона в наборе получить не выходит (скажем, выражение Range(Cells(1, 3), Cells(100, 3)).Cells.Item(i +1), где i - счётчик цикла, будет ссылкой не на следующий в выборке, а на прилегающий диапазон).
Выход вижу в создании массива адресов Range(Cells(1, 3), Cells(100, 3)) с соответствующей заменой конструкции на For Each-Next на For-Next:

Код: For i=0 to UBound(МассивАдресов)
...
If ... Then i = i +10
...
Next
Автор: Johnson Finger
Дата сообщения: 04.03.2010 10:08
vlth - я так и сделал, попробовав решение с просто For-Next, в итоге получилось добится, чтобы необходимое условие из выборки бралось из произвольного места. Только этот способ работает ооооочень долго, ибо критериев, которые необходимо найти около 400-т, а массив, где происходит поиск, содержит около 3 500 строк, плюс, когда нужный китерий находится, то вся строка копируется в тот диапазон, где находится это самое условие, соответственно адрес диапазона из которого беруться данные для поиска постоянно меняется. Как седсве, весь процесс дико затягивается. (однако For Each Pattern In Range работает почему то быстрее). Сейчас еще попробую метод прямого поиска через Search:What, предвариительно, скорость поиска выросла в несколько раз, т.к. не приходится шерстить все 3 500 строк.
Автор: Maximus777
Дата сообщения: 04.03.2010 11:43
Хелп ми кто-нить! Нужен пример организации в MS FlexGrid колонки с checkbox-ами, умеющими менять своё значение checked/unchecked
Автор: kfqr
Дата сообщения: 04.03.2010 12:21
ZlydenGL, crotoff

Цитата:
Cells.SpecialCells(xlCellTypeLastCell).Row

Это подойдёт только если данные вставляются на новый лист. Если вставить 10 строк, очистить, а затем вставить 5 строк, то xlCellTypeLastCell выдаст 10.

Решение есть тут: http://firststeps.ru/vba/excel/r.php?45
Автор: V4mp
Дата сообщения: 04.03.2010 14:12
Johnson Finger
for each уже своим названием подразумевает для каждого. В справке сказано тоже самое. Поэтому эта конструкция и работает так быстро (быстрее чем обычный for, который при каждом next заново определяет условия выборки).
Как я делаю в таком случае - оставляю тот же for each, внутри цикла включаю обыкновенный счетчик (i = i + 1) , а дальше при выполнении определенного условия просто пропускаю ненужный код и перехожу к next (понятно, с помощью обыкновенных if, но не в коем случае не case). Причем если сразу неизвестно количество эл-тов в pattern, то это легко выяснить конструкцией pattern.count

Добавлено:
Maximus777
Сразу необходимо создать класс, назовем его BtnClass
В нем написать (дальнейший код применителен к меткам (меняем на нужное)

Код: Public WithEvents LabelGroup As MSForms.Label
Автор: Maximus777
Дата сообщения: 04.03.2010 14:46
Хм, иногда полезно оставлять вопросы без ответов. Разобрался сам. Если кому-то интересно, вот:

Код: Private Sub Liv2_Click()
Col = Liv2.MouseCol
Row = Liv2.MouseRow
If Col = 0 Then
If Liv2.CellPicture = PicUnchecked.Picture Then
Set Liv2.CellPicture = PicChecked.Picture
Liv2.Col = 1: Liv2.CellFontBold = True: Liv2.CellBackColor = Liv2.BackColorSel
Else
Set Liv2.CellPicture = PicUnchecked.Picture
Liv2.Col = 1: Liv2.CellFontBold = False: Liv2.CellBackColor = Liv2.BackColor
End If
End If
End Sub
Автор: Burelomator
Дата сообщения: 04.03.2010 16:28
Всем доброго времени суток...
Помогите пожалуйста.
Как сделать транслитерацию в Excel 2007 в VBA или в макросе (нужен код) , чтобы он брал текст из определенной ячейки переводил и записывал результат в другую ячейку?...
Заранее благодарю... =)
Автор: Johnson Finger
Дата сообщения: 04.03.2010 18:13
V4mp - хм, кстати мысль, оставить for each, только пропускать код Чего-то сразу не допер, полез сначала на For...Next, а потом состряпал макрос который вообще ищет как при обычном ручном поиске по Ctrl+F, кстати, тоже быстро работает (по крайней мере быстрее чем For...Next), но быстрее ли чем for...each, пока не знаю, попробую переписать код поиска.
Автор: Maximus777
Дата сообщения: 04.03.2010 18:40

Цитата:
Как сделать транслитерацию в Excel 2007 в VBA или в макросе (нужен код)


Код: Public Function Translit(src$)
Static z As New Collection
On Error Resume Next
Dim i&, s$, r$, f$
If z.Count = 0 Then
Dim ru$(): ru = Split("а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ы,ь,э,ю,я", ",")
Dim en$(): en = Split("a,b,v,g,d,e,yo,zh,z,i,jj,k,l,m,n,o,p,r,s,t,u,f,kh,c,ch,sh,shh,',y,',eh,ju,ja", ",")
For i = LBound(ru) To UBound(ru)
z.Add en(i), ru(i)
Next i
End If
For i = 1 To Len(src)
r = Mid(src, i, 1): f = r: f = z(r)
If Not f = r Then If Asc(r) < 224 Or Asc(r) = 184 Then Mid(f, 1, 1) = UCase(Mid(f, 1, 1))
s = s + f
Next i
Translit = s
End Function
Автор: Onehunter
Дата сообщения: 04.03.2010 22:13
Прошу помощи. Как в Эксель можно посчитать продолжительность по времени между двумя датами, например, в часах. Скажем есть в двух столбцах начало и конец 2007.10.01 20:00 | 2007.10.02 01:25 как на автомате вычислять что между этими датами разница 5 часов 25 мин.? Спасибо!
Автор: vlth
Дата сообщения: 05.03.2010 00:16
Onehunter, в третьем столбце отнять от значения второго значение первого. И формат ячеек поставить соответствующий.
Автор: V4mp
Дата сообщения: 05.03.2010 13:52
Johnson Finger
с кем не бывает
отпишись тогда о результатах, самому интересно что быстрее будет.

Добавлено:
Maximus777
А как FlexGrid влепить на формочку эксэля?
У мну пишет "субъект не имеет доверия...."

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

Предыдущая тема: VS 2010


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