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

» Excel VBA (часть 2)

Автор: PerpleXOR
Дата сообщения: 28.06.2008 12:28
Имеется большая таблица, сформированная 1С, в ней много пустых клеток. Можно ли как-нибудь средствами экселя, не перебирая каждое значение, определить последний ряд в ней и последнюю колонку?
Автор: David_Kats
Дата сообщения: 28.06.2008 18:24
При выполнении кода выскакивает ошибка ERROR IN LOADING DLL. Причем, выскакивает все время в разных местах.
Из за чего она взялась и что теперь с ней делать?
Автор: nick7inc
Дата сообщения: 29.06.2008 19:04
David_Kats
Неплохо бы узнать, какую DLL не может загрузить.
Как вариант - скопировать текст программы в новый лист, причём только текст, не модули, не листы, а просто текст (можно через блокнот) и посмотреть, будет ли там вылетать. Возможно, что какой-то из References выключен или неправильно указан.
Если ничего не поможет, и вы пользуетесь только штатными функциями (без подгрузки дополнительных DLL), то переустановить офис.
Автор: sly6
Дата сообщения: 30.06.2008 20:38
Друзья, подскажите пожалуйста:

Есть список названий, вроде

"Вася"
"Петя"
"Коля"...

В интересующем диапазоне значения ячеек принимают вид:
"Вася_290000 Петя_18666 Коля_212"
"Петя_1 Коля_66665"
итп

Мне нужно выделить всех Вась_хххх диапазона одним цветом,
Петь_ххххх - другим итп, даже в пределах одной ячейки.

Самое близкое что я нашел - далее, но оно ищет точное совпадение и выделяет всю ячейку...


Dim strStartAddr As String ' Хранит координаты первого найденного _
значения
Dim rgResult As Range
Dim candidate1 As String
' Поиск первого входжения искомого слова
Set rgResult = Range("G14:G109").Find("Вася_290000", , xlValues)
If Not rgResult Is Nothing Then
' Сохраним адрес найденной ячейки (чтобы контролировать _
зацикливание поиска)
strStartAddr = rgResult.Address
End If
Do While Not rgResult Is Nothing
' Обработка результата поиска
rgResult.Interior.Color = RGB(255, 255, 0)
' Новый поиск
Set rgResult = Range("G14:G109").FindNext(rgResult)
If rgResult.Address = strStartAddr Then
' Поиск завершен
Exit Do
End If
Loop
Автор: WowGun
Дата сообщения: 01.07.2008 10:01
а почему бы не так ...

а ... понял ... шрифт разными цветами ...
тады ... так ..

Sub wr()
Set Target = Range("A:A")

For Each rn In Target
If rn.Value Like "*Вася*" Then
n = InStr(1, rn.Value, "Вася")
m = InStr(n, rn.Value, " ")
With rn.Characters(Start:=n, Length:=m - n).Font
.ColorIndex = 38
End With
End If

If rn.Value Like "*Петя*" Then
n1 = InStr(1, rn.Value, "Петя")
m1 = InStr(n1, rn.Value, " ")
With rn.Characters(Start:=n1, Length:=m1 - n1).Font
.ColorIndex = 33
End With
End If

If rn.Value Like "*Саша*" Then
n2 = InStr(1, rn.Value, "Саша")
m2 = InStr(n2, rn.Value, " ")
With rn.Characters(Start:=n2, Length:=m2 - n2).Font
.ColorIndex = 36
End With
End If
Next
End Sub
Автор: nopoxz
Дата сообщения: 02.07.2008 16:10
Создаю панель в екселе и там будет кнопка:

Код:
With .Controls.Add(Type:=msoControlButton)
.Style = msoButtonWrapCaption
.Caption = "Рефер"
.OnAction = "ref"
End With
Автор: SAS888
Дата сообщения: 03.07.2008 08:27
nopoxz
А что, макросом "ref" его нельзя открывать?
Автор: doc58_81oB0t
Дата сообщения: 03.07.2008 10:12
SERGE_BLIZNUK

корпус    квартира
КОР.1     КВ.61
КВ.37    

если не трудно помоги со скриптом для разовой проверки файла, чтоб КОР был в графе корпуса а КВ в строке квартира.
Автор: SAS888
Дата сообщения: 03.07.2008 11:15
doc58_81oB0t
Пусть столбец "A" - корпус, столбец "B" - квартира (где первая строка - заголовок). Тогда, можно, например, так:

Код: Dim i As Long
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
If Cells(i, "B") = "" Then Cells(i, "A").Cut Cells(i, "B")
Next
Автор: ValentinaK
Дата сообщения: 03.07.2008 19:00
Ребята помогите!!!
вопрос такой: у меня есть userform с label и spreadsheet и нужно чтоб при нажатии кнопки commandbutton были бы распечатаны данные с userform с заданым мною заголовком. пасибки
Автор: nopoxz
Дата сообщения: 04.07.2008 11:22
SAS888

у меня так и работает: в ячейку вписал линк на файл, а макрос "реф" нажимает на эту ячейку. Минус этого варианта в том, что рабочая область сдвигается к той ячейке, где прописан линк.

если есть другой вариант, можешь подсказать?
Автор: visual73
Дата сообщения: 04.07.2008 21:43
Пишу

g = Range("I1:I4").Value

и VBA проглатывает. Тогда что содержит переменная g ???
Можно ли вообще в одну операцию передать значения диапазона ячеек массиву, или нужен обязательно цикл, и по другому никак?
Автор: SERGE_BLIZNUK
Дата сообщения: 05.07.2008 06:59
visual73
я возьму на себя наглость ответить, да ещё и привести чужой код в качестве примера:
(с) Pavel55

Код:
Sub Макрос1()
Dim iArray As Variant
Dim i As Long
'просто для примера пишем 20 значений в столбец А
For i = 1 To 20
Cells(i, 1) = i
Next
'заполняем массив одним махом
iArray = Application.Transpose(Range("A1:A" & Range("A65536").End(xlUp).Row))
'а теперь переносим его одним махом в соседний столбец B
Range("B1:B" & UBound(iArray)) = Application.Transpose(iArray)
End Sub
Автор: visual73
Дата сообщения: 05.07.2008 08:19
SERGE_BLIZNUK
Спасибо.
Но это не совсем то что я хотел. Этот массив - массив ячеек. Мне нужен массив значений этих ячеек.
Мне кажется этот момент очень сильно скажется на производительности Excel. Одно дело работать с range а другое с Duble. А если ячеек 10 000 000?
Автор: SERGE_BLIZNUK
Дата сообщения: 05.07.2008 15:14
visual73
Цитата:
Мне кажется этот момент очень сильно скажется на производительности Excel.
а я думаю, что наоборот - быстрее, чем в цикле поочередно обращаться к каждой ячейке... впрочем, пробуйте - так и так, замеряйте время - всё в ваших руках.


Цитата:
Этот массив - массив ячеек. Мне нужен массив значений этих ячеек.

ну так там же в массиве значения! я Вас не понимаю!.. :-(


Цитата:
Одно дело работать с range а другое с Duble.
одно дело ходить в пальто, другое дело — ходить в кино... Каким образом Range (ссылка на ячейки) связано в с типом данных "Duble" (double, я полагаю описка...) ??!!
Автор: visual73
Дата сообщения: 05.07.2008 19:30
SERGE_BLIZNUK

А почему "как Variant"?

Цитата:
Dim iArray As Variant

У меня в ячейках находятся значения типа "Double" (..да, это описка была). Почему в данном примере я не могу использовать "As Double" ?

Я имел ввиду что можно работать с массивом состоящим из отдельных ячеек, каждому элементу массива можно например передать свойство .Value или например заблокировать .Locked=True.

Похоже в данном случае диапазон передает в массив значения. Спасибо.

P.S. Не кипятитесь. Можно например в пальто пойти в кино Все мы учимся.

Автор: nick7inc
Дата сообщения: 05.07.2008 22:07
visual73

Цитата:
А почему "как Variant"?
Цитата:Dim iArray As Variant
У меня в ячейках находятся значения типа "Double". Почему в данном примере я не могу использовать "As Double" ?

Можете, но есть несколько моментов.
1) если у вас в ячейке (случайно) будет тип данных не совместимый с Double, то работа макроса будет завершена по ошибке. А в случае получения в переменную Variant тип данных можно проверить.
2) Variant в некоторых случаях можно использоваться как неявный безразмерный массив. В приведённом примере функция возвращает массив со строго определённым размером.


Добавлено:
nopoxz

Цитата:
у меня так и работает: в ячейку вписал линк на файл, а макрос "реф" нажимает на эту ячейку. Минус этого варианта в том, что рабочая область сдвигается к той ячейке, где прописан линк.

А можно проблемную часть кода посмотреть? И что подразумевается под рабочей областью: выделение, прокрутка, активный лист/книга? Возможно, что код можно так сделать, чтобы ничего не сдвигалось, а если это невозможно, то можно попробовать просто запоминать рабочую область (?) и восстанавливать её после того участка кода, который её сдвигает.
Автор: visual73
Дата сообщения: 05.07.2008 23:56
nick7inc

Цитата:
Можете

Никак не работает с приведенным выше примером и Double. Попробуйте сами.
Автор: doc58_81oB0t
Дата сообщения: 06.07.2008 12:51
SAS888


Dim i As Long
For i = 3 To Cells(Rows.Count, "O").End(xlUp).Row
If Cells(i, "P") = "" Then Cells(i, "O").Cut Cells(i, "P")
Application.Run "'1.xlsm'!Макрос1"
Next


строка 3, столбец O-корпус, P-квартира

ошибку при выполнении выдает
Автор: PerpleXOR
Дата сообщения: 06.07.2008 20:55
А на мой вопрос что скажете? Есть какие-то встроенные функции, для определения последних столбца и строки таблицы, если в ней есть пустые ячейки?
Автор: XOPEK HAPKOMAH
Дата сообщения: 07.07.2008 09:07
Помогите, не нашел ответа.
Необходимо выбрать несколько файлов.
Использую:
file = Application.GetOpenFilename
в переменной file соответственно получаю ссылку на файл и далее
Workbooks.OpenText Filename:=file, и т.д.

Так я могу выбрать только один файл, хотелось бы использовать ctrl для выбора нескольких.
Автор: WowGun
Дата сообщения: 07.07.2008 09:47
XOPEK HAPKOMAH
сделай форму со списком, считай названия файлов в список и в нем сделай МНОЖЕСТВЕННЫЙ выбор ...

ЕСЛИ не подходит ...
Application.Dialogs(xlDialogOpen).Show
Автор: SERGE_BLIZNUK
Дата сообщения: 07.07.2008 20:23
PerpleXOR

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

что значит - "встроенные"?? и на VBA надо?
так пробовали?

Код:
Dim Col1, Col2 As Long
Col1 = ActiveWorkbook.ActiveSheet.UsedRange.Column
Col2 = Row1 + ActiveWorkbook.ActiveSheet.UsedRange.Columns.Count
MsgBox "Последняя использованная колонка на листе = " _
& Str(Col1 + Col2 - 1)
Автор: PerpleXOR
Дата сообщения: 07.07.2008 20:45
ух, сколько вариантов.
Спасибо больше, SERGE_BLIZNUK!
Буду пробовать.
Автор: doc58_81oB0t
Дата сообщения: 07.07.2008 21:57
SERGE_BLIZNUK

сохраненный файл формата Excel 2007 с макросами
Автор: XOPEK HAPKOMAH
Дата сообщения: 08.07.2008 05:01
WowGun

Цитата:
сделай форму со списком, считай названия файлов в список и в нем сделай МНОЖЕСТВЕННЫЙ выбор ...
ЕСЛИ не подходит ...
Application.Dialogs(xlDialogOpen).Show


Спасибо за советы, но форма не подходит.
Application.Dialogs(xlDialogOpen).Show не только выбирает но и открывает файлы, этого не надо. Надо именно список выбранных файлов. Что и как открыть далее решается программно, а это важно. Например, при открытии текстового файла выходит мастер текстов. Пользователю не нужны лишние действия.
Автор: LerOK777
Дата сообщения: 08.07.2008 08:54
Здравствуйте,у меня такой вопрос. Можно ли пользоваться функцией GetObject,получающей ссылку на excel-документ,не открывая этот документ(может есть похожая на нее функция).
У меня это функция правильно работает,только если перед этим вызвать Workbooks.Open Filename:=file_name
Автор: WowGun
Дата сообщения: 08.07.2008 11:06
XOPEK HAPKOMAH
ну если не в ФОРМУ (встроенную или пользовательскую) - тогда КУДА? если учесть, что надо ВЫБРАТь ...

ну в ЯЧЕЙКИ ... в столбик ... :u)
Автор: XOPEK HAPKOMAH
Дата сообщения: 08.07.2008 12:05

Цитата:
ну если не в ФОРМУ (встроенную или пользовательскую) - тогда КУДА? если учесть, что надо ВЫБРАТь

Я получаю в переменной ссылку на файл, уже писал код:

Цитата:
file = Application.GetOpenFilename

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


Автор: WowGun
Дата сообщения: 08.07.2008 12:48

Цитата:
хотелось бы использовать ctrl для выбора нескольких


Цитата:
в строковую переменную поместить или массив


если честно - НЕ понял ...
так выбор ВИЗУАЛЬНЫЙ или какой?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

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


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