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

» Excel VBA (часть 2)

Автор: WowGun
Дата сообщения: 31.07.2008 15:35
nopoxz
ну так и ПРИСВОЙ этой выделенной ячейке значение ПРЕДЫДУЩЕЙ + 1 ...
ActiveCell.Value=ActiveCell.Offset(-1, 0).Value+1
Автор: nopoxz
Дата сообщения: 31.07.2008 16:51
WowGun

ну так и присвоил.

спасибо.
Автор: WowGun
Дата сообщения: 01.08.2008 09:28
Sigmat
по сути дела надо просто КОПИРОВАТЬ данные по цене из файла "прайс-лист" в файл "база" в СООТВЕТСТВИИ с кодом номенклатуры ...
можно конечно сначала проверить ... но это только ДОПОЛНИТЕЛЬНАЯ обработка ... а результат ТОТ же ...

желательно ВИДЕТЬ макет файлов, чтобы НЕ изобретать самому ...
Автор: NaThAlieK
Дата сообщения: 01.08.2008 19:01
кто нибудь знает как с UserForm распечатать только например label, а не весь UserForm??? у меня получилось только весь userform распечатать, а отдельные его части ну никак не хочет печатать
заранее спасибо
Автор: ecolesnicov
Дата сообщения: 02.08.2008 14:53
NaThAlieK

Получается что никак ... можно правда извратиться: перед вызывом UserForm1.PrintForm поменять размер самой формы (свойствами height, weight), отключить видимость ненужных объектов (свойством visible), и возможно поменять местоположение объекта предназначенного для печати (свойствами left, top) - так чтобы на ней остался виден только нужный объект (label например). После печати - поменять все взад! Также можно передавать содержимое нужного объекта (насколько я понимаю именно оно интересует) на рабочий лист и печатать оттуда. Смотря какая цель стоит - если печать содержимого - тогда 2-ой вариант лучше, а если требуется распечатать объект именно так как он выглядит на форме - тогда 1-ый вариант делай.
А кстати, почему бы не расположить управляющие элементы прямо на листе, а не на UserForm (т.е. вообще не использовать UserForm)? Тогда для каждого объекта можно установить печатать его или нет и потом очень легко печатать целиком весь лист при печати которого будут видны только нужные объекты.

Автор: DonRus
Дата сообщения: 04.08.2008 09:39
Ситуция такая. Есть макрос в личной книге макросов "Personal.xls". И есть программа на Delphi из которой выгружаются в Excel даные. Проблема в том, что при запуске Excel из Delphi не подгружается "Personal.xls". Сначала вроде ничего, нажал кнопку на панели инструментов и порядок, файл подгрузился. Но это если нет открытой копии Excel. А если есть открытый Excel, то при нажатии на кнопку грузится еще одна копия этого файла и соответственно начинает ругаться, мол файл уже открыт! Что можете посоветовать? Excel 2003.
Автор: RMKusto
Дата сообщения: 04.08.2008 23:16
Помогите пожалуйста, очень нужен такой код, но не знаю VBA:

Условия :

A1 - ячейка ввода данных
B1=IF(A1>0;NOW();"No Data")

C1 =IF(B1<>"No Data";" выполняеться код - CTRL + C(B1); CTRL + PASTE SPECIAL -> VALUES (C1)";0)
______________________________________________

Одним словом, должна фиксироваться сегодняшняя дата.

Если можно, то очень поможет и такой код который при определённых условиях помещал подобные данные в разные 8 ячеек, например:
Все условия те же, но

IF(A1=1 , код прописывает значение в С1, если A1=2, то в C2, и так до 8.

Буду очень признателен если поможете, уже на нескольких форумах посвящённых excel не могут помочь.

Автор: ivas
Дата сообщения: 04.08.2008 23:59
RMKusto
Цитата:
уже на нескольких форумах посвящённых excel не могут помочь
Во-первых, так как Вы ставите задачу сложно что-то понять.
Во-вторых, это что такое?
Цитата:
выполняеться код - CTRL + C(B1); CTRL + PASTE SPECIAL ->

В-третьих, а условия-то где?
Цитата:
код который при определённых условиях

Вы вообще представляете что такое программный код?


Автор: RMKusto
Дата сообщения: 05.08.2008 14:17

Цитата:
Во-вторых, это что такое?

Цитата:
выполняеться код - CTRL + C(B1); CTRL + PASTE SPECIAL ->



Если значение ячейки B1 не равно значению "No Data", то автоматически выполняеться действие: копирование значения ячейки B1, Вставка значения в ячейку C1 ( не формулу, а именно значение, в excel делаеться при помощи Paste special > values, на VBA не знаю как ).

Что я могу объяснить лучше?


Автор: SERGE_BLIZNUK
Дата сообщения: 05.08.2008 15:34
RMKusto
Ваша проблема решается очень легко.
Если только Вы ответите (прежде всего себе самому ;-) на простые вопросы:
- в какой момент должна появляться текущая дата в ячейке C1 (когда изменилась ячейка A1 и стала больше нуля)?
- должна ли эта дата изменяться? Если A1 изменили - что должно произойти?
Автор: RMKusto
Дата сообщения: 05.08.2008 16:10
Пока спрашивал, подумал и сам решил задачу


Код:

Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .Address = "A9" And .Value = "EDI" Then
Range("C17").Select
Selection.Copy
Range("D17").Select
Selection.PasteSpecial Paste:=xlPasteValues
Range("A9").Activate

End If: End With:

With Target
If .Address = "B9" And .Value = "EDI" Then
Range("C18").Select
Selection.Copy
Range("D18").Select
Selection.PasteSpecial Paste:=xlPasteValues
Range("B9").Activate

End If: End With:

With Target
If .Address = "A9" And .Value = "REV" Then
Range("C19").Select
Selection.Copy
Range("D19").Select
Selection.PasteSpecial Paste:=xlPasteValues
Range("A9").Activate


End If: End With:

With Target
If .Address = "B9" And .Value = "REV" Then
Range("C20").Select
Selection.Copy
Range("D20").Select
Selection.PasteSpecial Paste:=xlPasteValues
Range("B9").Activate


End If: End With:

With Target
If .Address = "A9" And .Value = "GEN" Then
Range("C21").Select
Selection.Copy
Range("D21").Select
Selection.PasteSpecial Paste:=xlPasteValues
Range("A9").Activate


End If: End With:

With Target
If .Address = "B9" And .Value = "GEN" Then
Range("C22").Select
Selection.Copy
Range("D22").Select
Selection.PasteSpecial Paste:=xlPasteValues
Range("B9").Activate


End If: End With:

With Target
If .Address = "A9" And .Value = "DEL" Then
Range("C23").Select
Selection.Copy
Range("D23").Select
Selection.PasteSpecial Paste:=xlPasteValues
Range("A9").Activate


End If: End With:

With Target
If .Address = "B9" And .Value = "DEL" Then
Range("C24").Select
Selection.Copy
Range("D24").Select
Selection.PasteSpecial Paste:=xlPasteValues
Range("B9").Activate



End If: End With: End Sub

Автор: MORPHIUSS
Дата сообщения: 06.08.2008 02:11
Люди знающие. помогите, если можно. Задачка такого плана - есть таблица с автофильтром. Возможно ли каким-нибудь образом значение, по которому в данный момент происходит отбор, автоматически проставить в независимую ячейку? Значения текстовое. Заранее спасибо.
Автор: nopoxz
Дата сообщения: 06.08.2008 10:41
не пойму в чём проблема:

всё отлично работало (в июле), пока не наступил месяц август...


Проверка даты - три колонки, куда вводятся даты (формат - Date, Armenian 14.03.2008/ dd.mm.yyyy)

Ввожу данные от руки, либо макросом:

Код:
Sub PasteDate()
Dim strDate As String
strDate = Format(Now(), "dd.mm.yyyy")
Selection.Value = strDate
Cells(ActiveCell.Row + 1, ActiveCell.Column).Select
End Sub
Автор: mal001
Дата сообщения: 06.08.2008 11:19
Добрый день. Мне необходимо реализовать задачу сверки данных: xls-файл и doc-файл.
Преобразовав (скопировав) данные из ворд на лист екселя предполагаю что как-то это сравнение можно сделать с помощью VBA. В новом листе excel( в который скопировал) данные теперь забиты на каждой строчке, но в один столбец ( в строках данные разделяются различным числом пробелов). Сверяться сначала должны 3 строковые ячейки (для каждой строчки) в первом листе и находить соответствие (в том же порядке везде всё находится) на втором листе, после этого сверять еще 3 ячейки из первого листа( из найденных совпадающих строк) и сравнивать с продолженим строк вторго листа. В результате надо получить строчки (выделить их как-то) где имеется расхождение. Как это проще реализовать?
Автор: WowGun
Дата сообщения: 06.08.2008 11:38
MORPHIUSS
ну формулами ... НЕ получится, а VBA ... и ПЕРВЫЙ фильтр ... и ПЕРВЫЙ (самый левый) столбец фильтра ...

Range("H1").Value = Mid(ActiveSheet.AutoFilter.Filters.Item(1).Criteria1, 2)
Автор: David_Kats
Дата сообщения: 06.08.2008 15:15
Подскажите, почему при программном создании кода во вновь добавленном листе выскакивает такая ошибка:

Run-time error '9':
Subscript out of range

Причем, активна только кнопка End, а Debug нажать невозможно.
Скорее всего, проблема в этом куске кода:

With ThisWorkbook.VBProject.VBComponents(NewSheet.Name).CodeModule
NextLine = .CountOfLines + 1
.InsertLines NextLine, code
End With

Если его закомментить, проблем не возникает.
Автор: visual73
Дата сообщения: 06.08.2008 15:47
Разбиваю текстовую строку по столбцам познаково.
Можно ли это записать кратко с учетом того что я не знаю длины строки (каждый раз меняется) в начальной ячейке:


Код: Range("M1:M3").TextToColumns Destination:=Range("M1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(i, Array(2, 1), Array(3, 1), Array(4, 1), Array _
(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array _
(12, 1), Array(13, 1), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), _
Array(19, 1), Array(20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array( _
25, 1), Array(26, 1), Array(27, 1), Array(28, 1)), TrailingMinusNumbers:=True
Автор: WowGun
Дата сообщения: 06.08.2008 16:07
visual73

да можно ...

For i = 1 To Len(Range("A1").Value)
Range("A1").Offset(0, i).Value = Mid(Range("A1"), i, 1)
Next
Автор: ecolesnicov
Дата сообщения: 06.08.2008 16:28
visual73

Если именно с вашим диапазоном (M1:M3), то можно еще и так:

Код:
A = Range("M1:M3") 'Берем исходный диапазон в массив
For r = 1 To UBound(A, 1) 'Цикл по строкам массива
For n = 1 To Len(A(r, 1)) 'Цикл по знакам текущего элемента
Cells(r, n + 12) = Mid(A(r, 1), n, 1) 'Разносим знаки
Next n
Next r
Автор: visual73
Дата сообщения: 06.08.2008 17:18
WowGun
ecolesnicov
Большое спасибо!

А одномерный массив состоящий из текстовых строк можно как-то вставить в ячейки Excel моментально, или же нужно использовать Ваши выше предложенные способы? Если эти методы, то я соображу сам, но может еще чего можно придумать ?

Типа:
Массив(1) = "Карл"
Массив(2) = "УКлары"
Массив(3) = "Украл"
Массив(4) = "Кораллы"
разложить в

К а р л
Автор: ecolesnicov
Дата сообщения: 06.08.2008 23:00
visual73


Цитата:
может еще чего можно придумать ?


Если даже и можно - то я этого не знаю ... То что я написал и есть разложение такого "массива" строк! Замените M3 на M4 в моем примере в первой строке, заполните ячейки M1, M2, M3, M4 вашими словами и они будут расскладываться! Можно конечно на базе того что излагалось развивать дальше - так например, у меня в массив (Array) засовывается только исходный диапазон слов, а разложенные символы пишутся прямо в ячейки на листе, а можно их тоже писать в массив, а потом одни махом вставить массив на лист ... В этом случае программный код конечно увеличиться, но зато работать раз в 10 быстрее будет! По моему опыту именно на операциях чтения/записи в ячейки и тратиться максимальное время, но это существенно только если речь идет о десятках тысяч записей ... Также стоит вставить проверку на количество доступных колонок (ведь символов в слове может быть теоретически больше чем колонок на листе). Также можно "отвязаться" от явного задания диапазона (т.е. не указывать в коде прямо M1:M3) ... вообщем дальше развивать это можно очень долго. Из этого можно написать функцию - и тогда не важно какой длинны код функции - в своем программном коде вызываещь имя функции и в качестве аргумента даешь ему исходный диапазон слов - ровно 2 слова!
Автор: dneprcomp
Дата сообщения: 07.08.2008 02:39
nopoxz
Попробуй
Код:
If (Month(Format(iCell,"dd.mm.yyyy")) <> Month(Format(Now(),"dd.mm.yyyy"))) Then
MsgBox "Месяц не совпадает с текущим!", vbExclamation + vbOKOnly, "Внимание"
End If
If (Year(Format(iCell,"dd.mm.yyyy")) <> Year(Format(Now(),"dd.mm.yyyy"))) Then
MsgBox "Год не совпадает с текущим!", vbExclamation + vbOKOnly, "Внимание"
End If
Автор: visual73
Дата сообщения: 07.08.2008 06:34
ecolesnicov

Цитата:
В этом случае программный код конечно увеличиться, но зато работать раз в 10 быстрее будет!

Как раз от десятков тысяч мне и надо

Цитата:
Также стоит вставить проверку на количество доступных колонок

Хорошо что в 2007 можно 32000 знаков вводить, уже не критично. Но на всякий случай

Очень большое спасибо за ценный разбор полетов!
Автор: ecolesnicov
Дата сообщения: 07.08.2008 09:31
visual73
Приятно видеть слова благодарности! Требуется более подробный пример с массивом и функцией или сами разберетесь?
Автор: visual73
Дата сообщения: 11.08.2008 13:59
Вот такой проблем
Имеется одномерный массив. Каждый элемент - это текстовая строка.
Для того чтобы его вставить в лист использовал
Range(... ) = Application.Transpose(Массив)
Но при некоторых обстоятельствах вылетала ошибка. Методом тыка сделал резюме: эта функция не поддерживает элементы массива больше 255 знаков, хотя в 2007 версии Экселя ячейка может содержать 32 тыс. знаков.
Как быть? Как развернуть массив при вставке?
Автор: ecolesnicov
Дата сообщения: 11.08.2008 14:47
visual73

Цитата:
Как развернуть массив при вставке?

Полный цикл с перебором. Просто меняешь индексы колонок и строк при вставке ...
Типа того:


Код:
'исходный массив по вертикали в первой колонке (вместо фиксированного значения 50 - может быть вычисленная переменная).
A=Range(Cells(1,1),Cells(50,1))

'массив "для вставки" по горизонтали (к-во можно вычислять из 1-го массива), но начинается со 2-ой колонки, чтобы не накладывался на исходный (это как захотите).
B=Range(Cells(1,2),Cells(1,51))

'Цикл по строкам 1-го массива, элементы которого по столбцам заносятся в колонки 2-го массива
For i=1 to Ubound(A,1)
B(1,i)=A(i,1)
next i

Назад записываем массив результурующий
Range(Cells(1,2),Cells(1,51))=B
Автор: visual73
Дата сообщения: 11.08.2008 15:00
ecolesnicov

Наверно и функция .Transpose также работает, странно тогда почему она не поддерживает >255 знаков. Да и вообще какое отношение значения массива имеют к транспонированию массива? Наверно у них просто ограничивающая проверка стоит.

Ладно обойдем это ограничение так Спасибо!
Автор: ecolesnicov
Дата сообщения: 11.08.2008 15:12
visual73

Ой... Я кстати, не подумал, а ведь при вставке массива в диапазон (последния строка в моем примере) те же ограничения могут срабатывать ... Опишись please, сработает так или нет - если нет, будем думать дальше!
Автор: Serglen
Дата сообщения: 12.08.2008 17:53
Задача: есть столбец, в котором диапозоны заполненных числами ячеек разделены пустой ячейкой. Нужно после каждого диапозона в пустую ячейку проставить сумму по этому диапозону.
Думал перебирать ячейки снизу вверх, пока не дохожу до не пустой ячейки и потом делать автосумму, но пока ничего не получилось. Помогите, пожалуйста, с решением, возможно есть другой способ?

Автор: dneprcomp
Дата сообщения: 12.08.2008 19:41
Serglen
Попробуй
Код: Cells.Find(What:="", After:=ActiveCell, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
Cells.FindNext(After:=ActiveCell).Activate

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

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


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