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

» Excel VBA (часть 3)

Автор: Amrek
Дата сообщения: 08.06.2011 15:32
Все разобрался
Автор: msmih
Дата сообщения: 08.06.2011 19:05

Цитата:
народ, подскажите как решить такую задачу:
есть 200 листов в книге. как подсчитать количество листов с определенными условиями (условно если на листе А1=1, А2=2 - тогда листы считаются)


уважаемый asbo в соседней ветке подсказал следующий код


Код: Sub sb_SheetsQty()
Dim i% ' k%
Dim bTmp As Boolean
Dim sSht As Variant
For Each sSht In Sheets
bTmp = True ' вставить код со своими условиями проверки
i = i - bTmp
Next
Debug.Print i
End Sub
Автор: asbo
Дата сообщения: 08.06.2011 19:12
msmih, дык, если вот это "А1=1, А2=2", то
bTmp = (Cells(1, 1).Value = 1 And Cells(2, 1).Value = 2)
Лист будет считаться, если и ячейка A1 = 1, и ячейка A2 = 2

Я там добавил в ответ прикидку варианта с формулами.
Автор: msmih
Дата сообщения: 08.06.2011 19:31

Цитата:
msmih, дык, если вот это "А1=1, А2=2", то
bTmp = (Cells(1, 1).Value = 1 And Cells(2, 1).Value = 2)
Лист будет считаться, если и ячейка A1 = 1, и ячейка A2 = 2

Я там добавил в ответ прикидку варианта с формулами.

что-то не так делаю... результатом выводит общее количество листов
Автор: asbo
Дата сообщения: 08.06.2011 19:43
msmih
Это моя ошибка :(
Правильное обращение к ячейке: sSht.Cells(1, 1).Value
Нет под руками Excel.


Добавлено:
bTmp = (sSht.Cells(1, 1).Value = 1 And sSht.Cells(2, 1).Value = 2)
Автор: msmih
Дата сообщения: 08.06.2011 19:48

Цитата:
bTmp = (sSht.Cells(1, 1).Value = 1 And sSht.Cells(2, 1).Value = 2)

как сказал великий Матроскин: "Заработало!!!!"

громадное спасибо за помощь!
Автор: borMMAN
Дата сообщения: 08.06.2011 23:55
кто подскажет куда поделся SetFocus у textBoх? Этот Excel 2010 начинает действовать мне на нервы
Автор: asbo
Дата сообщения: 09.06.2011 06:56
borMMAN, дык и в 2003 он тоже поделся :)
Это если на лист контролы бросать. А если на форму - то будет вам и белка, будет и свисток :)
Автор: andrewkard1980
Дата сообщения: 09.06.2011 09:34
Добрый день, Коллеги.
Нужно средствами VBA удалить модуль, подключаю библиотеку - Microsoft Visual Basic for Applications Extensibility 5.3. Пишу код:

Код:
Dim vbc As VBComponent
Set vbc = ThisWorkbook.VBProject.VBComponents("Module1")
ThisWorkbook.VBProject.VBComponents.Remove vbc
Set vbc = Nothing
Автор: Amrek
Дата сообщения: 10.06.2011 13:52
Подскажите возможно ли такое сделать макросом, либо какими другими средствами:

Надо подсчитать количество ячеек в столбце по определенному условию, и сохранить эти данные в текстовый файл.

К примеру надо подсчитать количество ячеек с числом 10 в столбце 1:

1 2 3 4 5
1 10 45
2 70 12
3 10 11
4 10 10
5 20 21

На выходе хотелось бы видеть файл 1.txt с содержимым: 3
Автор: asbo
Дата сообщения: 10.06.2011 14:18
Amrek, прежде всего надо разделить задачу на две части и определиться - как делать - средствами Excel или VBA.

Если Excel - подсчитать, значение нао тдельный лист, экспортировать. Подсчет в смежной теме, в хэлпах, в инете разжеван уже до блевотины.

Если VBA - циклом по ячейкам с проверкой на условие. Вывод в текстовый файл - FileSystemObject.
Автор: Amrek
Дата сообщения: 10.06.2011 15:51
Вообще это бы надо автоматически собирать информацию допустим каждый час
Автор: asbo
Дата сообщения: 10.06.2011 16:32
Amrek, вообще-то, тут не гестапо - клещами тянуть военную тайну.

К VBA клоните? Я девочка что ли, чтобы меня за тохес подталкивать к ответу на Вами же заданный вопрос? Да и ответил я по обоим вариантам.

Таймера хочеца, чтобы не грузил проц, которого в VBA нету? Дык, пишите сразу мыло, куда скинуть проект и в какие сроки уложиться. Бзв, а я ничего за это должен еще не останусь?

Что у Вас по предложенной схеме VBA не получается? А что уже сделано?
Из шапки:

Цитата:
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.


Автор: borMMAN
Дата сообщения: 13.06.2011 19:22
Есть вот такой запрос на добавление:
cmd.CommandText = "INSERT INTO TABL(STVSKV, NUM5, NUM10, NUM15, NUM20, NUM25, NUM30, AVGS, DATA) VALUES ('" & arrStvor(bytString) & "','" & IIf(IsEmpty(arr(bytString, 1)) Or (arr(bytString, 1)) = 0, Null, arr(bytString, 1))"

Бьюсь с одной проблемой уже 2 день. Значит поля в базе (NUM5, NUM10...) имеют тип Double, запрет на ввод 0, и могут быть пустыми. Так вот, передаваемые данные могут содержать 0 и Empty. Для этого сделал проверку в запросе IIF. Если оно срабатывает, то должен передаваться NULL, НО!! хитрожопый Excel передает какой-то свой Null, зарезервированный тип данных, и при передаче этого запроса получаю "несоответствие типов данных условия отбора". Я недаром написал NULL и Null, так как первый вариант проходит на ура, НО часть запроса где НУЛЛ используется находится в '"& & "' (есесно что бы читались переменные), поэтому написать NULL в верхнем регистре я не могу, Excel его сразу переводит в Null. Что я только уже не подставлял - результата нет.
Я в курсе как это все организовать по-другому, но мне надо именно таким образом.
Народ выручайте что подставить шоб Access не возбухал?
Автор: asbo
Дата сообщения: 13.06.2011 20:17
1. Причем здесь Excel?
2. Баланс скобок
3. NULL не видно в упор
4. Запрос - это строка, т.е. надо "Null" писать в ней буквами, а не передавать откуда-то.
5. Непонятно - где функции запроса, а где Экселя.
6. Предполагаю, что д.б. так:

cmd.CommandText = "" & _
"INSERT INTO " & _
"TABL(STVSKV, NUM5, NUM10, NUM15, NUM20, NUM25, NUM30, AVGS, DATA) " & _
"VALUES (" & _
Chr(39) & arrStvor(bytString) & Chr(39) & ", " & _
Chr(39) & IIf(IsEmpty(arr(bytString, 1)) Or arr(bytString, 1) = 0, "Null", arr(bytString, 1)) & Chr(39) & _
")"
Автор: borMMAN
Дата сообщения: 13.06.2011 21:04
Да нет же повторяю, что проходит только "чистый" NULL например:

cmd.CommandText = "INSERT INTO SERET(STVSKV, NUM5, NUM10, NUM15, NUM20, NUM25, NUM30, AVGS, DATA) " & _
"VALUES ('3-1','200',Null,Null,Null,Null,Null,Null,'121')"

Никакие другие варианты не принимаются, типа "Null" или 'Null' и много других вариантов, что нарыл в нете. Насчет верхнего регистра звеняюсь, прокатывает любой, но только без скобок. Но как я писал в конструкции IFF Null опознается как зарезервированный тип, а в этом варианте (('3-1','200',Null,Null,Null,Null,Null,Null,'121')") он передается как текст, Но без скобок и Access его принимает нормально. Собственно вариантов решения пока вижу 2: 1) убрать каким то способом скобки 2) подставить переменную с типом Null "понятным" Access.
Хелп
Автор: asbo
Дата сообщения: 13.06.2011 21:32
borMMAN, что "нет"? Оставь лирику.
Я же специально понумеровал вопросы. Тяжело по порядку ответить?

7. Покажи всю строку, как строку, которую Акс воспринимает нормально.
8. Покажи те места, которые формируются Excelем
9. Покажи ф-цию, которая эти места формирует.

Уверен, как только сделаешь - сам поймешь.
Автор: borMMAN
Дата сообщения: 13.06.2011 21:51

Автор: asbo
Дата сообщения: 13.06.2011 22:43
borMMAN, суть проблемы я понял. Причину вижу. Но я не волшебник - ты не понимаешь меня :( Или я что-то не то спрашиваю... А я не умею объяснять на пальцах. Ответь, плз, попунктно на 7, 8, 9 и буквально - как написано. Я тогда смогу пальцем на предполагаемую ошибку указать. Или еще вопросы задам.

Добавлено:
И я же написал уже - Акс хочет строку - так и дай ему ее. Нафига ты ему переменную подсовываешь с неявным преобразованием?
Автор: borMMAN
Дата сообщения: 13.06.2011 23:08
Решение найдено
Автор: InSe0F
Дата сообщения: 15.06.2011 17:55
Появилась еще одна проблемка Возникла необходимость собрать быстро коды строк по критерию отбора. Суть ниже:

Код Данные Критерий 1 Критерий 2
Автор: smirnvlad
Дата сообщения: 15.06.2011 20:55
InSe0F
критерий выбирает пользователь через автофильтр?
Автор: InSe0F
Дата сообщения: 15.06.2011 21:18
нет зачем, можно через условие функции если такое возможно...
Мне по сути надо функцию в котрой при заданных условиях и диапазонах строк будет происходит выбор, я пробовал сделать через СУММЕСЛИМН но там сумма ж а мне надо через запятые... но логика как раз похожая
Автор: aidomars
Дата сообщения: 16.06.2011 09:44
InSe0F
Вот пользовательская функция, пользуй.
Public Function Find(ColumnCrit As Byte, Crit As String, ColumnFind As Byte, Delimiter As String)
i = 1
Do While Cells(i, ColumnCrit) <> ""
If Cells(i, ColumnCrit) = Crit Then Find = Find & Delimiter & Cells(i, ColumnFind)
i = i + 1
Loop
Find = Replace(Find, Delimiter, "", 1, 1)
End Function
Автор: InSe0F
Дата сообщения: 16.06.2011 10:31
что-то не получаетяся .. или я не правильно юзаю ее
в стоблце Студенты № должно вывестись как раз то что надо
http://d.pr/VMO0
Автор: aidomars
Дата сообщения: 16.06.2011 10:49
Скачать не могу, на работе.
Нажми Alt+F11, добавь модуль (insert-module), вставь код. Затем в пустой ячейке жми Вставка функции и выбери из категории Определенные пользователем функцию Find.
Укажи:
ColumnCrit- номер столбца с критериями (например 3)
Crit - критерий (Вася)
ColumnFind - номер столбца с кодами (1)
Delimiter - знак разделения (|, запятая или другое)
Автор: InSe0F
Дата сообщения: 16.06.2011 11:20
так как вставить и куда я понимаю

вот с номерами столбцов было не понятно, но теперю исопльзую так
=FindAllEntry(СТОЛБЕЦ(тСтуденты[Кафедра]);[@Кафедра];СТОЛБЕЦ(тСтуденты[№]);",")
правда теперь вместо ошибки стал выдавать просто 0
Автор: aidomars
Дата сообщения: 16.06.2011 11:28
Я делал судя по примеру выше, где таблица. "Код" это ячейка A1, соответственно и в моем примере в скобках - номера столбцов.
Автор: InSe0F
Дата сообщения: 16.06.2011 11:54

Цитата:
ColumnCrit- номер столбца с критериями (например 3)
Crit - критерий (Вася)
ColumnFind - номер столбца с кодами (1)
Delimiter - знак разделения (|, запятая или другое)

вот прямо так на этой таблице и сделал
в отдельной ячейке ввожу (на данном листе)
=Find(3;"Вася";1;"|")
по этой таблице - выдает "0" ((
(картинко http://d.pr/JlzG)

вообще мне надо чтобы работало по диапазонам чтобы я мог указывать на другом листе ссылки...
Автор: aidomars
Дата сообщения: 16.06.2011 12:49

Цитата:
по этой таблице - выдает "0" ((

Странно, у меня все работает, посмотри в дебуге значения какие.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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