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

» Excel VBA

Автор: SERGE_BLIZNUK
Дата сообщения: 14.04.2007 13:20
konfetkin

Цитата:
вот как получить координаты последней ячейки или размер масс

через arr.Columns.Count arr.Rows.Count
вот, пример, для события Worksheet.Change
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
R1 = Target.Row
R2 = R1 + Target.Rows.Count - 1
C1 = Target.Column
C2 = C1 + Target.Columns.Count - 1
MsgBox "From " & R1 & "," & C1 & " to " & R2 & "," & C2
End Sub
Автор: konfetkin
Дата сообщения: 14.04.2007 19:05
SERGE_BLIZNUK

Цитата:
через arr.Columns.Count arr.Rows.Count

Спасибо!
Автор: aar
Дата сообщения: 16.04.2007 08:37
Наверное, я туплю, но как получить номер последней заполненной ячейки в выделенном столбце?
Автор: AndVGri
Дата сообщения: 16.04.2007 09:16
Mpa3b

Цитата:
есть, например текст, копируем его, и по спецсимволам обрезать, переносить, фильтровать...

функцией split можно разбить текст по любому набору символов, включая и спецсимволы.
Более качественно можно через RexExp

Цитата:
например, хочу, что бы после 3 слов автоматически смена ячейки была, ввожу,
ввожу, а оно само "укладывается"

Это не выйдет. События Change (любые, генерируются только в случае завершения ввода: переход после ввода в другую ячейку или нажатие Enter)
Автор: The okk
Дата сообщения: 16.04.2007 09:16
aar

Код: lngLastRowInColumn = Selection.Find(*).Row
Автор: aar
Дата сообщения: 16.04.2007 11:02
The okk
Благодарю. Только не работает.



Иногда возникает ситуация, когда условие сравнения значений в столбцах двух листов
Код: Worksheets(1).Cells(i, 1).Value = Worksheets(2).Cells(j, 1).Value
Автор: The okk
Дата сообщения: 16.04.2007 11:44
aar

Цитата:
Иногда возникает ситуация, когда условие сравнения значений в столбцах двух листов

Код: Worksheets(1).Cells(i, 1).Value = Worksheets(2).Cells(j, 1).Value

используемого в циклах For, не срабатывает, хотя заведомо известно, что есть пересекающиеся данные
Автор: aar
Дата сообщения: 16.04.2007 12:36
The okk

Цитата:
Это попытка найти значения первого столбца первого листа в первом столбце второго?

Да.


Цитата:
пересекающихся данных действительно нет

По Ctrl+F находит значение в обоих листах.


Цитата:
есть какие-то пробелы или непечатные символы

StrComp корректно отрабатывает сравнение, т.е. находит одинаковые данные на обоих листах.
Автор: The okk
Дата сообщения: 16.04.2007 13:53
aar
И что нужно сделать, если, скажем в А10 второго листа лежит значение А1 первого? Скорее всего задача решается вообще без макроса - только формулами.
При использовании Ctrl+F ставил галочку "Ячейка целиком"?
Автор: aar
Дата сообщения: 16.04.2007 14:04
The okk

Цитата:
что нужно сделать, если, скажем в А10 второго листа лежит значение А1 первого?

Выделить зеленым цветом ячейки в первом и во втором листах.

Как формулами решать - не знаю.


Цитата:
При использовании Ctrl+F ставил галочку "Ячейка целиком"?

Да.
Автор: Dzak
Дата сообщения: 16.04.2007 14:23
подскажите пожалуста
существует ли возможность в VBA создать на одном лисите несколько автофильтров для ограниченных количеством строк диапазонов
Автор: Panteran3785
Дата сообщения: 16.04.2007 15:22
Помогите составить условие (код)? В ячейке А1, например содержится следующий текст - Мобильные персональные компьютеры (ноутбуки), а в ячейке В1 - Мобильный ПК Acer "TravelMate 2483WXMi" LX.TJ90Y.001 (C M 430-1.73ГГц, 512МБ, 80ГБ, GMA950). Нужно, чтобы в ячейке С1 отобразилось значение ячейки А1, если в ячейке В1 есть совпадение со словом Мобильн. Вообще-то таблица на самом деле большая, порядка 8000 строк, структура ее следующая: например, в ячейке А61 записана общая категория, а в ячейках с В63 по В200 наименования, относящиеся к этой категории. Далее в ячейке А201 новая категория, с В202 по В250 - наименования к этой категории и т.д. Нужно, чтобы в любом пустом столбце (например, столбец С) по каждому наименованию отобразилась соответствующая категория.
Помогите, пожайлуста.
Автор: aar
Дата сообщения: 16.04.2007 15:45
Может, я загнался, но задача такова.
Два листа одной книги. Нужно сравнить выделенные в обоих листах столбцы, одинаковые пометить зеленым цветом, расхождения - красным. Плюс еще кое-какая обработка.

Не знаю, как получить номера первой и последней ячеек в выделенном столбце
Автор: SERGE_BLIZNUK
Дата сообщения: 17.04.2007 02:37
aar
Цитата:
Не знаю, как получить номера первой и последней ячеек в выделенном столбце
ну, формальный ответ - через Selection.Row, Selection.Rows.Count
И, если это единственная трудность, тогда ловите [more=код- пример отображения номера строк выделенных и реально заполненных в выделенном диапазоне]
Код:
Sub Example1()
Dim col0 As Long, r1 As Long, r2 As Long, rowRealLast As Long
Dim NameList1 As String, NameList2 As String

NameList1 = "Лист1"
NameList2 = "Лист2"

' Определить число используемых рядов:
Worksheets(NameList1).Activate
If Selection.Columns.Count > 1 Then
MsgBox "Вы выделили более одного столбца..."
Exit Sub
End If
col0 = Selection.Column
r1 = Selection.Row
r2 = r1 + Selection.Rows.Count - 1
If IsEmpty(Cells(r2, col0)) Then
rowRealLast = Cells(r2, col0).End(xlUp).Row
Else
rowRealLast = r2
End If
MsgBox "на листе " & NameList1 & " выделен столбец " & col0 & " cо строки " & r1 & " по строчку " & r2 & _
Chr(13) & " Реально заполнены по строку " & rowRealLast

Worksheets(NameList2).Activate
If Selection.Columns.Count > 1 Then
MsgBox "Вы выделили более одного столбца..."
Exit Sub
End If
col0 = Selection.Column
r1 = Selection.Row
r2 = r1 + Selection.Rows.Count - 1
If IsEmpty(Cells(r2, col0)) Then
rowRealLast = Cells(r2, col0).End(xlUp).Row
Else
rowRealLast = r2
End If
MsgBox "на листе " & NameList2 & " выделен столбец " & col0 & " cо строки " & r1 & " по строчку " & r2 & _
Chr(13) & " Реально заполнены по строку " & rowRealLast

End Sub
Автор: AndVGri
Дата сообщения: 17.04.2007 08:18
SERGE_BLIZNUK

Цитата:
ну, формальный ответ - через Selection.Row, Selection.Rows.Count

не пройдёт, так как aar написал что выделен полный столбец. Получим 1 и 65536 (Excel 97-2003)
Чего-то путного по этой теме в методах и свойствах Range не нашёл. Стоит сделать, наверное, так:

Код:
Dim vRows As Long, vFirstRow As Long, vLastRow As Long

'Получим номер первой не пустой строки выделения
If IsEmpty(Selection.Cells(1&, 1&).Value) Then
vFirstRow = Selection.Cells(1&, 1&).End(xlDown).Row
Else
vFirstRow = Selection.Row
End If

'Получим номер последней не пустой строки выделения
vRows = Selection.Rows.Count
If IsEmpty(Selection.Cells(vRows, 1&).Value) Then
vLastRow = Selection.Cells(vRows, 1&).End(xlUp).Row
Else
vLastRow = Selection.Row + vRows - 1&
End If
Автор: The okk
Дата сообщения: 17.04.2007 09:11
AndVGri
Все проще:

Код: Dim vRows As Long, vFirstRow As Long, vLastRow As Long
vFirstRow = Selection.Find("*").Row
vLastRow = Selection.Find(What:="*", SearchDirection:=xlPrevious).Row
Автор: Dzak
Дата сообщения: 17.04.2007 09:13
AndVGri
спасибо пошел читать что это такое
я в свою очередь понял, что совсем чет не тяну VBA, хотя и ...
уточню вопрос в надежде чтобы ткнули где читать - весь лопатить VBA ей-ей времени нету
на Лист 1 сгруппированы предприятия по отраслям (то есть отрасль 1 - А5 и ее предприятия А6-А20, отрасль 2 - А21 и ее предприятия А22-40) теперь одновременно нужно поставить фильтры на А5 И А 21, при этом чтобы фильтр в А5 отразил выборку с диапазона А6-А20 и незатрагивал ниже А20. Обычный автофильтр фильрует весь список с А5 и до А65536
Автор: The okk
Дата сообщения: 17.04.2007 09:45
Dzak
Не получится. Один столбец - один автофильтр.
Автор: AndVGri
Дата сообщения: 17.04.2007 09:47
Dzak

Цитата:
о есть отрасль 1 - А5 и ее предприятия А6-А20, отрасль 2 - А21 и ее предприятия А22-40

А вам не кажется, что у вас нарушены в этом случае правила группировки? Правильно ведь, чтобы было в столбце А названия отраслей, а в столбце В названия предприятий, чтобы строки были независимы друг от друга. В вашем же случае отнесение предприятия к отрасли зависит от положения его названия относительно ячеек A5 и A22 - или я чего-то не понимаю? И не понимаю, что вы, в таком случае, пытаетесь отфильтровать?

Добавлено:
The okk
Спасибо
Автор: The okk
Дата сообщения: 17.04.2007 09:56
AndVGri

Цитата:
И не понимаю, что вы, в таком случае, пытаетесь отфильтровать?

В одном столбце много не связанных друг с другом диапазонов. Он хочет повесить автофильтр на каждый из диапазонов. А у Excel ограничение - если он вешает автофильтр, предыдущий сотрется.
Автор: Dzak
Дата сообщения: 17.04.2007 10:14
AndVGri
прошу прощения за такой способ, отражения проблемы


The okk
жаль а счастье казалось так близко
Автор: SERGE_BLIZNUK
Дата сообщения: 17.04.2007 11:19
AndVGri
Цитата:
не пройдёт, так как aar написал что выделен полный столбец. Получим 1 и 65536 (Excel 97-2003)
в принципе, тема уже закрыта ответом The okk, но просто для соблюдения справедливости.. вы зря не заглянули в тот код, который я привёл под ссылкой
"код- пример отображения номера строк выделенных и реально заполненных в выделенном диапазоне" ;-))) мы с Вами мыслим в одном направлении:
Код:
r2 = r1 + Selection.Rows.Count - 1
If IsEmpty(Cells(r2, col0)) Then
rowRealLast = Cells(r2, col0).End(xlUp).Row
Else
rowRealLast = r2
End If
Автор: The okk
Дата сообщения: 17.04.2007 11:27
SERGE_BLIZNUK

Цитата:
полностью согласен! Читай Золотое правило!

Я писал для AndVGri - чтобы он макрос не писал. Я видел твой пост.
Автор: AndVGri
Дата сообщения: 17.04.2007 11:46
The okk
SERGE_BLIZNUK
Да понял, я понял, простите наистрожайшие, больше не буду
Dzak
Хоть не по месту (Excel FAQ - это), вот так можно со списками. первый по id>1.3, второй id>2.1
Автор: Dzak
Дата сообщения: 17.04.2007 13:09
coool
ну вот это уже решение
огрооомнейшее спасиб, дело в том, что сам то я посчелкать каждый раз выбирая смогу, но только файл будет высталяться на обоздрение и уж там ничего не объяснишь
как говорится ларчик просто открывался
Автор: crotoff
Дата сообщения: 17.04.2007 15:41
Привет, авторитеты! Подскажите как нам разделить многострочный текст, содержащийся в одной ячейке на несколько однострочных ячеек. Это при экспорте из 1С получается, в конце строки стоит невидимый символ, типа как нажимаешь при вводе "ALT+Enter" в конце каждой строки. А на выходе нужно получить однострочные ячейки с текстом, лучше даже в другом листе. Это видимо нужно как-то реализовать программно? Может быть на AutoIT кто-нть скрипт знает?
Автор: Panteran3785
Дата сообщения: 17.04.2007 15:44
Ребята! Помогите пожайлуста доработать код. Это к моему предыдущему вопросу. Есть функция, которая извлекает из текста определенное слово, в моем случае первое и есть код, котрый должен сразу во все строки определенного диапазона в 12 столбец добавить извлеченное слово из текста.

Function ExtractElement(Txt, n, Separator) As String
'возвращает n-элемент текстовой строки

Dim AllElements As Variant

AllElements = Split(Txt, Separator)
ExtractElement = AllElements(n - 1)

End Function

Sub ДобавлениеКатегории()
Dim rst As Range
Dim i As Integer
Dim lRowsCount As Long, lColCount As Long

'работаем с листом
With Workbooks("FCB070413.xls").Worksheets("FCB070413")
'определяем количество используемых строк
lRowsCount = .UsedRange.Rows.Count
'и столбцов
lColCount = .UsedRange.Columns.Count
'определение диапазона, начиная с 24 строки
For i = 24 To Cells(lRowsCount, lColCount)
Cells(i, 12) = ExtractElement(Cells(i, 3), 1, "" "")
Next i
End With
End Sub
Саму таблицу можно посмотреть по адресу:http://www.fcenter.ru/products.shtml?eshop и там выбрать - HTML (zip)
Автор: crotoff
Дата сообщения: 17.04.2007 16:03
2Panteran3785

тебе паходу придётся сделать в цикле перебор по всем общим категориям чтобы сравнить, содержится ли в B искомый текст. Я бы наверно использовал комбинации встроеных функций - условия "Если" и функции для текста, например "Найти" или "ПоискПозиции" в соседних столбцах - для каждой категории свой столбец, ну а затем их консолидировать через "&" в сводном столбце. А уже этот сводный столбец категорий переместить в С или ещё куда. Это можно и в скрипте реализовать, даже быстрее будет чем обычный перебор.
Автор: keha
Дата сообщения: 17.04.2007 16:05
Можно как-нибудь с помощью макросов создать пустой (новый) текстовый файл и записать в него с разделителями выборочные столбцы? (Например есть столбцы A, B, C, D, E, и нужно, чтобы в текстовый файл попали данные из столбцов A, D и E, разделенные точкой с запятой.)

Или здесь поможет только удаление столбцов B и C, с последующим сохранением "сохранить как"?
Автор: AndVGri
Дата сообщения: 17.04.2007 17:45
Panteran3785

Цитата:
For i = 24 To Cells(lRowsCount, lColCount)

А если в Cells(lRowsCount, lColCount) находится текст? Почему старт с 24 строки?


Добавлено:
crotoff

Код:
Dim i As Long, splitResult() As String

splipResult = VBA.Split(ActiveCell.Value, vbCr) 'а может vbCrLf или vbLf - эксперементируй
For i = LBound(splitResult) To UBound(slitResult)
Worksheets("ИмяЛистаВставки").Cells(i + Offset, 1&).Value = splitResult(i) 'Offset - смещение до требуемой строки
Next i

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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