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

» Excel VBA (часть 3)

Автор: oshizelly
Дата сообщения: 02.10.2013 09:42
NJCorp 22:27 01-10-2013
Цитата:
назначаете переменные,

Нельзя ли вот здесь поподробнее для дебилов ' чайников неопытных пользователей?

vikkiv 22:40 01-10-2013
Цитата:
Простейший вариант если застрял можно через Macros Recorder сделать и приспособить опции как нужно

Здесь сразу появляется маленький, но очень большой вопрос: какие именно действия записывать через Macros Recorder? Если имеется в виду Special Paste, то про неё я уже отписал постом выше.
Автор: Preslay
Дата сообщения: 09.10.2013 01:38
Доброго времени суток!

Стал такой вопрос: Есть книга MS Office 2007, в ней два листа, на одном массив из 17 столбцов и 203000 строк, на втором 1 столбец и 15000 строк.
Задача: Надо из 203000 строк удалить строки, где в столбце "f" значения совпадают со значениями второго листа (с количеством строк 15000)
Как это действо провернуть??
С экселем редко сталкиваюсь....
Автор: AndVGri
Дата сообщения: 09.10.2013 05:47

Цитата:
203000 строк удалить строки, где в столбце "f" значения совпадают со значениями второго листа

Применить расширенный фильтр к первому листу по данным столбца второго листа (подробнее всё есть в справке). Далее удалить на первом листе отфильтрованные строки. Даже VBA не нужен
Автор: KF121
Дата сообщения: 09.10.2013 23:33
AndVGri
поподробнее можно про расширенный фильтр со связями с другого листа/книги. ссылку можно где почитать
Автор: AndVGri
Дата сообщения: 10.10.2013 02:57

Цитата:
поподробнее можно про расширенный фильтр

Можно даже с видео
Автор: Preslay
Дата сообщения: 14.10.2013 18:41

Цитата:
[/q]
[q]Применить расширенный фильтр к первому листу по данным столбца второго листа (подробнее всё есть в справке). Далее удалить на первом листе отфильтрованные строки. Даже VBA не нужен



Спасибо!
Автор: Fsp050
Дата сообщения: 18.10.2013 22:53
Постепенно осваиваю vba))
начинаю с простых формул. если а1=3, то б1=1, если а1=1 или 2 или 4, то б1=0.
If a1=3 then
b1=1
else
if a1=1 or a1=2 or a1=4 then
b1=0
end if
end if

а что если мне надо, чтобы в одном коде было больше таких формул
,чтобы дальше шло продолжение
если а2=2, то б2=1, если а2=3 или 1 или 2, то б1=0

далее
если а3=4, то б3=3, если а3=2 или 1 или 3, то б1=0

и таких формул может быть бесконечно много. Как правильно выстраить и заканчивать код. Кого он будет вида.
Автор: vikkiv
Дата сообщения: 19.10.2013 00:09
Fsp050
If condition list 1 Then
event list 1
ElseIf condition list 2 Then
event list 2
... 3
...
... n-1
Else
event list n
End If
Автор: R1tyty
Дата сообщения: 20.10.2013 18:13
Кто поможет ?
Есть файл http://rghost.net/49606653, в нем лист с ОТЧЕТ
На листе есть макрос "печать", который вставляет информацию в колонтитулы и печатает лист. Удобная штука я вам скажу...
Как его выдернуть вместе с формой в другую книгу, у меня не получается, выскакивают ошибки ?
Автор: sasheg
Дата сообщения: 21.10.2013 19:47
Здрасьти всем! Помогите, пожалуйста, в беде

Надо построить сводную таблицу на отдельном листе.
Таблица с данными выглядит примерно так:

ААА 100
ААА 200
ААА 200
ААА 100
ААА 200
ВВВ 250
БББ 101
ВВВ 150
ВВВ 250
БББ 101

Написал такую подпрограмму:
Sub Test()
Sheets.Add After:=Sheets("Лист1")
ActiveSheet.Name = "Лист"

Sheets("Лист").Cells(2, 2).Value = "=countif(Лист1!A1:A10, ""=AAA"")"
Sheets("Лист").Cells(2, 4).Value = "=countifs(Лист1!A1:A10, ""=AAA"", Лист1!B1:B10, ""=100"")"
End Sub

Выдает 5 и 2. Тут все хорошо.

Вопрос:
Как записать A10 и "ААА" через переменные i=10 и var="ААА"?
Необходимо именно через переменные, т.к. количество и содержание строк постоянно меняется. Сами же переменные i и var будут браться из других функций.

Пробовал сделать так:
    i = 10
    Sheets("Лист").Cells(2, 2).Value = "=countif(Sheets("Лист1").Range("A1:A"&i), ""=AAA"")"
Не работает, хоть и Sheets("Лист1").Range("A1:A"&i) в других местах срабатывает.

Спасибо!
Автор: vikkiv
Дата сообщения: 21.10.2013 20:03
sasheg
... Range(Cells(1, 1), Cells(i, 1)) ...
Added
Охх, нет, то что выше не подойдёт - ты пишешь это значение как формулу в ячейки ..
Не хочешь случаем записать именно результат а не формулу?
Есть решения но в данном случае ошибка из-за того что значение в ячейке должно быть на языке Excel а не VBA,
если нужно именно в таком виде то можно собрать на самом деле типа ...Value = "=CountIf(.." & i & "," & x & ")"
Автор: sasheg
Дата сообщения: 21.10.2013 20:21
Можно и значение, лишь бы оно вычислялось через countif(s) с параметрами i и var.
Автор: vikkiv
Дата сообщения: 21.10.2013 20:58
sasheg
тогда просто,
.Value = WorksheetFunction.CountIf(Sheets("Лист1").Range(Cells(1, 1), Cells(i, 1)), var)

Кажется там была проблема если пишет и сравнивает на разных неактивных листах то вроде-бы если не ошибаюсь перед Cells() внутри Range лучше поставить соответствующий Sheets().
Автор: sasheg
Дата сообщения: 21.10.2013 21:51
vikkiv
Спасибо!


Цитата:
перед Cells() внутри Range лучше поставить соответствующий Sheets()

Да, иначе вылетает ошибка.
Если везде указать имя листа, то вариант с Range("A1:A" & i) тоже работает.

Ниже три варианта записи. Может, пригодится кому-нибудь.

Sub Test()
Sheets.Add After:=Sheets("Лист1")
ActiveSheet.Name = "Лист"

i = 10
tmp1 = "AAA"
tmp2 = 100
    
Sheets("Лист").Cells(2, 2).Value = "=countif(Лист1!A1:A10, ""=AAA"")"
Sheets("Лист").Cells(3, 2).Value = WorksheetFunction.CountIf(Sheets("Лист1").Range(Sheets("Лист1").Cells(1, 1), Sheets("Лист1").Cells(i, 1)), tmp1)
Sheets("Лист").Cells(4, 2).Value = WorksheetFunction.CountIf(Sheets("Лист1").Range("A1:A" & i), tmp1)

Sheets("Лист").Cells(2, 4).Value = "=countifs(Лист1!A1:A10, ""=AAA"", Лист1!B1:B10, ""=100"")"
Sheets("Лист").Cells(3, 4).Value = WorksheetFunction.CountIfs(Sheets("Лист1").Range(Sheets("Лист1").Cells(1, 1), Sheets("Лист1").Cells(i, 1)), tmp1, Sheets("Лист1").Range(Sheets("Лист1").Cells(1, 2), Sheets("Лист1").Cells(i, 2)), tmp2)
Sheets("Лист").Cells(4, 4).Value = WorksheetFunction.CountIfs(Sheets("Лист1").Range("A1:A" & i), tmp1, Sheets("Лист1").Range("B1:B" & i), tmp2)
End Sub
Автор: Fsp050
Дата сообщения: 25.10.2013 21:45

Цитата:
Fsp050
If condition list 1 Then
event list 1
ElseIf condition list 2 Then
event list 2
... 3
...
... n-1
Else
event list n
End If


vikkiv
только сейчас дошел до дела.
я попытался написать как вы сказали, но у меня ничего не получилось и макрос не пишется.

Помогите, пожалуйста, записал последовательность свои действий. Что тут не так и как исправить.
http://video.yandex.ru/users/jerrymaya/view/17/#
Автор: vikkiv
Дата сообщения: 25.10.2013 23:48
Fsp050 - Код надо в субрутину {Sub} вставлять а не сверху.
Код: Sub test()
a = Range("A1")
If a = 1 Then
Range("B1") = "A"
ElseIf a = 2 Then
Range("B1") = "B"
ElseIf a = 3 Then
Range("B1") = "C"
ElseIf a = 4 Then
Range("B1") = "D"
Else: Range("B1") = "E"
End If
End Sub
Автор: Fsp050
Дата сообщения: 27.10.2013 12:00
vikkiv
Преограмаднейшее Вам спасибо. здоровски, у меня получилось.

за основу взял этот Ваш код
Sub test()
a = Range("A1")
If a = 1 Then
Range("B1") = "A"
ElseIf a = 2 Then
Range("B1") = "B"
ElseIf a = 3 Then
Range("B1") = "C"
ElseIf a = 4 Then
Range("B1") = "D"
Else: Range("B1") = "E"
End If
End Sub

Я уже понял как делать эту часть уже даже сам продолжил на остальные вопросы анкеты ставить баллы, но надо продолжить усложнение кода.
Например в нашей анкете у нас есть 2 шкалы. Надо суммировать баллы для каждой, например в ячейке С-первая шкала, в ячейке D вторая и так далее
как записать,что надо суммировать ответы на вопросы кот в ячейке b1, b3 и записать сумму в С1, сумму ответов b2 и b4 записать в D1

Автор: vikkiv
Дата сообщения: 27.10.2013 14:27
Fsp050
Прямо так и пишется, один из простейших вариантов наверное будет:
Range("C1")= Range("B1")+Range("B3")
Range("D1") = Range("B2") + Range("B4")
Автор: Fsp050
Дата сообщения: 28.10.2013 19:22
vikkiv
а это писать прямо под кодом? после end sub?
и такой вопрос. он касается постановки какой то интерпретации. Например, если значение С1 =5, то вставить "интерпретация1" А если значение лежит в диапазоне от 1-4, то вставить текст "интерпретации2". Если значение с1 идет от 6-8 то вставить текст "интерпретация3"
тоже касается и ячейки D1.
Автор: vikkiv
Дата сообщения: 28.10.2013 20:07
Fsp050
1) Всё пишется в пределах конкретной выполняемой продцедуры, в данном случае между
Код: Sub test6666()
...
разный код
...
End Sub
Автор: Fsp050
Дата сообщения: 28.10.2013 22:29

Цитата:
1) Всё пишется в пределах конкретной выполняемой продцедуры, в данном случае между

тут понял

Цитата:
2) Если целевой столбец например F то код для проверки состояния С1 будет следующим:

а можно без целового столбца , чтобы текст был "спрятан в самом коде?"

Цитата:
P.S. Я не очень понимаю каким боком здесь VBA? Просто поизвращаться? Эти примитивные операции выполняются простейшими формулами Excel, даже если условий 5-6 и больше на каждую ячейку..

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

А как мне вывести на экран кнопку с надписью "нажать и посчитать"?)
Автор: vikkiv
Дата сообщения: 28.10.2013 23:19
Fsp050 тогда можно через присваивание значения переменной например с выводом результата в окне контроля (которое внизу редактора VBA) чтобы не пропадало вникуда:
Код: Sub test9999()
x = Range("C1"): a = "Case"
If x = 5 Then
b = a & 1
ElseIf x <= 4 And x >= 1 Then: b = a & 2
ElseIf x <= 8 And x >= 6 Then: b = a & 3
End If: Debug.Print b: End Sub
Автор: oshizelly
Дата сообщения: 29.10.2013 20:01
Уважаемые All!
На мой вопрос 2-недельной давности о копировании свойств форматирования ячейки так никто и не ответит?

18:07 01-10-2013

Цитата:

Цитата: Чем Вас не устраивает "Специальная вставка"?

Да всем не устраивает  Во-первых, она не только применяет формат целевым ячейкам, но вместе с этим форматом вставляет и данные, а это не то же самое. Во-вторых, даже если бы не эта проблема, скрипт нужен как бы для автоматизации часто используемых операций. А специальная вставка (Paste Special) требует активного и более или менее вдумчивого участия юзера: вызываешь диалог, смотришь на него, переставляешь галку в нужное место, жмёшь OK... Долго и при быстрой работе чревато человеческими ошибками.
Автор: KF121
Дата сообщения: 30.10.2013 00:01
oshizelly
за 2 недели уже бы призумали как решит проблему а не просто сидели и ждади пока за вас ее кто-то решит.
Автор: wshdc
Дата сообщения: 30.10.2013 08:45
KF121 +1

oshizelly

Цитата:
Да всем не устраивает Во-первых, ... Во-вторых, .... А специальная вставка ... Долго и ... чревато ...

Значит, макароны вы понимаете, маймуну понимаете, а что такое посольство, бедненькие, не знаете?
Тебе впору уже самому других консультировать - столько тебе за все время было предоставлено готовых решений разной степени сложности.

Цитата:
Когда-то здесь выкладывался скрипт, который ...

Ты даже не удосижлся имя выложившего или просто ссыль дать. Из благодарности и уважения для. А адаптировать-то его под свои нужды не судьба?

У объекта Range есть куча свойств. Бери нужные тебе у ячейки источника и применяй к целевому диапазону. С буфером обмена не связывайся.

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

Ты уже задолбал откровенно паразитарным образом жизни. Что здесь, что в вордовской ветке...
Автор: galex87
Дата сообщения: 30.10.2013 09:26
Надо найти на листе "Лист1" такую строку, значение второй колонки которой будет равно значению Sheets("Лист2").Cells(1, 1).Value и взять из этой строки значение из четвертой колонки.
Как в этом случае написать команду Find()?
ЧТО ИСКАТЬ: Sheets("Лист2").Cells(1, 1).Value
ГДЕ ИСКАТЬ: Sheets("Лист1").Columns("B:B").

Если нельзя сразу взять значение из 4 колонки, то как узнать номер найденной строки?

Пробовал получить хотя бы значение из второй колонки, по которой идет поиск, но Excel заругался. Пробовал так:
Sheets("Лист2").Cells(1, 2).Value = Sheets("Лист1").[B:B].Find(Sheets("Лист2").Cells(1, 1).Value, Sheets("Лист1").Cells(Rows.Count, 2).End(xlUp).Offset(1), xlPrevious)
и
Sheets("Лист2").Cells(1, 2).Value = WorksheetFunction.Find(Sheets("Лист2").Cells(1, 1).Value, Sheets("Лист1").Cells(Rows.Count, 2).End(xlUp).Offset(1), xlPrevious)
Автор: wshdc
Дата сообщения: 30.10.2013 10:28
galex87
Я бы не связывался с поиском.

For Each c in Columns(2).Cells
If c.Value = "Something" then MyVar = c.Offset(0, 4).Value
Next

Добавлено:
* Offset(0, 2)
* exit for
Автор: oshizelly
Дата сообщения: 30.10.2013 11:25
wshdc 08:45 30-10-2013
Цитата:
У объекта Range есть куча свойств. Бери нужные тебе у ячейки источника и применяй к целевому диапазону.

Вопрос был о принципиальной возможности решения задачи, и о направлении, в котором нужно копать.
Честно говоря, так этого и не понял, как именно можно "брать у ячейки источника и применять к целевому диапазону" нужные значения объекта Range
Тем более, что
Цитата:
С буфером обмена не связывайся.
А с чем тогда связываться??


Цитата:
Запись макроса не пробовал делать и вынуть отуда нужные строчки кода? Попробуй. Запиши несколько отдельных макросов по изменению каждого из интересующих тебя свойств, потом слей их воедино.

Опять же по кругу ходим. Я уже объяснял на предыдущей странице, что использовать запись макроса невозможно, потому что непонятно, что именно записывать в макрос. Обычно в макрос записывают штатные действия для их автоматизации. Но, насколько мне известно, GUI-интерфейс сабжа вообще не предусматривает переноса свойств ячейки на целевую ячейку. Или я что-то пропустил?


KF121 00:01 30-10-2013
Цитата:
за 2 недели уже бы призумали как решит проблему а не просто сидели и ждади пока за вас ее кто-то решит.

Вы действительно уверены, что всем участникам данного топика необходимо было узнать, что вы лично не имеете никаких мыслей по заданному вопросу (или не хотите ими делиться, что то же самое)? Подумайте о тех, кто получил на мыло автоматическое уведомление о вашем посте с 0% информации. Если испытываете дефицит общения, то для этого социальные сети, а на Ru-Board - раздел флейма.
Автор: far4our
Дата сообщения: 30.10.2013 14:59
Добрый день!
На строчке:

MinDate = CStr(ActiveCell.Value)
With ActiveSheet.PivotTables("Сводная").PivotFields("Прирост")
.BaseItem = MinDate
End With


Вылетает ошибка Invalid procedure call or argument (Error 5).

Причём в отладчике я могу просмотреть значение ActiveSheet.PivotTables("Сводная").PivotFields("Прирост").BaseItem.
И если сделать, например, MinDate = "_"+CStr(ActiveCell.Value), то всё будет работать.

В чём косяк? Спасибо!
Автор: galex87
Дата сообщения: 31.10.2013 07:35
wshdc

Цитата:
Я бы не связывался с поиском.
For Each c in Columns(2).Cells
If c.Value = "Something" then MyVar = c.Offset(0, 4).Value
Next
Добавлено:
* Offset(0, 2)
* exit for

Попробовал сделать через For Each и Excel зависает намертво.
Сделал через
While Sheets("Лист1").Cells(i, 2).Value <> ""
If(...)
i=i+1
Wend
Пока работает, но все равно хочется научиться использовать Find. Можно ли в нем задавать два условия через And или отдельными параметрами?
Возможно, ошибаюсь и надо использовать не Find, а что-то иное.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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