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

» Excel VBA (часть 3)

Автор: Maximus777
Дата сообщения: 30.08.2012 19:09
aidomars
так все ячейки принимают значение "-0.005". Какой-то C++ синтаксис ...
Автор: grbdv
Дата сообщения: 30.08.2012 19:29
panda3
Цитата:
Для нестрадающих гигантоманией (во всех смыслах) можно использовать такой код:

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

Ты классно "оптимизировал", отрезав половину функционала. Конгениально.

Единственное нововведение - замена 'For i' на 'For Each'. Поясни, плз, чем вызвана эта необходимость?

Ну, а дальше - по стопам нашего юного друга Макса :)
- объявление 'c' и константы при каждом вызове, вместо единственного раза при открытии книги;
- обращение к дефолтному свойству 'c', вместо явно указанного 'c.Value';
- работа непосредственно с ячейкой, вместо ее значения;
- использование дефолтной константы вместо декларируемой;
- принуждение пользователя править исполняемый код;
- объявление публичной саму исполняемую процедуру, вместо вызывающей.

Короче - все в лучшем и самом дурном стиле воинствующих ньюбикофф. А точнее - совсем без стиля. Удафщина в программировании :)

Вы за одной партой с Максом сидите? Тем более, судя по этому:
Цитата:
Maximus777: очень красивый вариант.


aidomars
Цитата:
А так красивше?)
Код:Selection = -0.005

Самое красивое - это вааще без кода. С чего, собственно, и начинали.
Автор: Maximus777
Дата сообщения: 30.08.2012 20:01
grbdv
Цитата:
Вы за одной партой с Максом сидите?

Добро пожаловать в фан-клуб Макса. Ему правда поздно уже, на пятом десятке, за парту, ну это же не смущает тебя, в твоих непрерывных усилиях самоутверждения? Хоть и замечание твои, по большей части, в тему, но их реальная значимость весьма преувеличена, как и твоя самооценка.

grbdv
Цитата:
Удафщина в программировании

Лучше уж удафщина при общении с VBA, чем удафщина при общении с людьми.
Автор: grbdv
Дата сообщения: 30.08.2012 20:07
Maximus777

Цитата:
grbdv
Цитата:Вы за одной партой с Максом сидите?

Добро пожаловать в фан-клуб Макса. Ему правда поздно уже, на пятом десятке, за парту, ну это же не смущает тебя, в твоих непрерывных усилиях самоутверждения? Хоть и замечание твои, по большей части, в тему, но их реальная значимость весьма преувеличена, как и твоя самооценка.

grbdv
Цитата:Удафщина в программировании

Лучше уж удафщина при общении с VBA, чем удафщина при общении с людьми.


А ты понял, что ты уже на личности перешел?

Я тебе предъяв по коду выкател на следующие полгода твоего обучения. Ты бы молчал, пока или не опровергнешь их, или не признаешь свою неправоту и нубизм.

Добавлено:

Цитата:
Лучше уж удафщина при общении с VBA, чем удафщина при общении с людьми.

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

Добавлено:

Цитата:
Добро пожаловать в фан-клуб Макса. Ему правда поздно уже, на пятом десятке,

Вот это самое грустное :(
Автор: Maximus777
Дата сообщения: 30.08.2012 20:49
grbdv
Цитата:
Я тебе предъяв по коду выкател на следующие полгода твоего обучения. Ты бы молчал, пока или не опровергнешь их, или не признаешь свою неправоту и нубизм.

Если бы я хоть раз заикнулся, что я гений VBA, а здесь "конкурс красоты VBA-кода", то это имело бы хоть какой-то минимальный смысл. Но реальность несколько отличается ... А по коду я тебе уже написал, ты прав, но эта правота имеет такое гипертрофированное значение только для тебя.

У меня в офисе несколько лет работает макрос, хз сколько там строк, но размер его под мегабайт. С плотным использованием WinAPI и самописной dll в придачу. Если бы ты его увидел, своим "смышлёным взглядом", то возможно тебя бы хватил сердечный приступ. Но как ты понимаешь, больше это никого особо не заботит. Работает себе макрос и не жужжит.

grbdv
Цитата:
Давай так - удафщину в программировании обсуждаем здесь

Не думаю, что кроме тебя, здесь это интересует ещё кого-то. Тем более, в таких тонах.
Автор: panda3
Дата сообщения: 30.08.2012 21:10
Продолжим наш вечер юмора. Если нужно менять шаг изменения ячеек (-0,005), можно записать его в ячейку, присвоить ей имя (например, Delta) и использовать макрос:

Код: Public Sub DecreaseCells()
[Delta].Copy
Selection.PasteSpecial Operation:=xlPasteSpecialOperationAdd
End Sub
Автор: grbdv
Дата сообщения: 30.08.2012 21:16
Maximus777
Цитата:
Если бы я хоть раз заикнулся, что я гений VBA, а здесь "конкурс красоты VBA-кода", то это имело бы хоть какой-то минимальный смысл.

Я не за абстрактную красоту кода борюсь, а за функционал, масштабируемость и ... не поверишь, за красоту.

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

Я давно переболел супероптимизацией, поверь. Мне щаз на VBA, в COM-модели приходится писать задачи, где быстродействие идет на единицы миллисекунд. И те же внешние библиотеки на C++ и т.д. и т.п..


Цитата:
У меня в офисе несколько лет работает макрос, хз сколько там строк, но размер его под мегабайт. С плотным использованием WinAPI и самописной dll в придачу. Если бы ты его увидел, своим "смышлёным взглядом", то возможно тебя бы хватил сердечный приступ. Но как ты понимаешь, больше это никого особо не заботит. Работает себе макрос и не жужжит.
Конечно, я был бы в шрке, ты прав. Он разово написан и работает. Вот и слава Богу. Не надо трогать. А моя задача - 15К строк без малого, внешний API, три подключаемых самописных библиотеки, пяток классов, десяток модулей. Но она требует к себе ежедневного внимания. И если бы я так же наплевательски относился к культуре программирования, к стилю, к читабельности - я бы с ней не справился.

Цитата:
grbdv
Цитата:Давай так - удафщину в программировании обсуждаем здесь
Не думаю, что кроме тебя, здесь это интересует ещё кого-то. Тем более, в таких тонах.
Ну и не думай... Достаточно того, что как минимум меня это волнует. Ты полегче за всю толпу гунди. Первый день в тырнете?

И что ты из себя институтку из Смольного строишь? В каких таких тонах? Я пытаюсь с тобой конструктивно говорить, а у тебя обиды и надутые губки... Тем более, при откровенных ляпах и некомпетентности.

Не зная собственно языка ты еще пытаешься рассуждать о правильности чужого пожзода и приоритетах красоты в пользу лаконичности и функциональности... Дилетанство, бьющее само себя в грудь...
Автор: Maximus777
Дата сообщения: 30.08.2012 21:41

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

С кем борешься? С "воинствующими нубиками"? Предварительно нарекая так оппонентов. Но представь на секунду, с тобой то никто не борется. Может пора завязывать курить травку?


Цитата:
Он разово написан и работает. Вот и слава Богу. Не надо трогать. А моя задача - 15К строк без малого, внешний API, три подключаемых самописных библиотеки, пяток классов, десяток модулей. Но она требует к себе ежедневного внимания.

Ты слишком большое значение придаёшь своей личности. Мантра "все петухи, а я д'Артаньян" ни к чему хорошему тебя не приведёт. Почему у тебя что-то требует внимания, а у других "одноразово"? Откуда такие далеко идущие (очень далеко) выводы?


Цитата:
Достаточно того, что как минимум меня это волнует.

Волновайся, сколько влезет. Это твоя личная трагедия. Хотя я бы советовал тебе успокоиться и спуститься на землю.


Цитата:
Я пытаюсь с тобой конструктивно говорить

Это иллюзия.

Автор: grbdv
Дата сообщения: 30.08.2012 21:53
Maximus777
Ты очень обижен. Я понимаю. Вступив подряд в несколько лепешек и морального, и профессионального плана, тяжело делать вид, что ничего не произошло. Иди, учи отлтичия функций листа от функций языка. Выучишь - поговорим.

А пока продолжай хвататься за мои опечатки "интересует-волнует". Больше тебе заняться нечем.
Автор: Maximus777
Дата сообщения: 30.08.2012 22:02

Цитата:
Ты очень обижен.

Эта иллюзия как раз и возникает на почве раздутого ЭГО. Я забуду о тебе, как только закрою страницу в браузере.


Цитата:
Я понимаю.

Забавный самообман.


Цитата:
Вступив подряд в несколько лепешек и морального, и профессионального плана, тяжело делать вид, что ничего не произошло.

Я же писал тебе, что по коду ты прав, но значение этой правоты очень сильно преувеличено. Поэтому я не делаю вид, что ничего не произошло, я тебе открытым текстом говорю, не произошло ничего значительного. Мне нет нужды волноваться. Это целиком и полностью твоя проблема.


Цитата:
Иди, учи отлтичия функций листа от функций языка.

Только если приспичит. Что вряд ли случится в обозримом будущем.
Автор: grbdv
Дата сообщения: 30.08.2012 22:11
Maximus777
Так мы никогда не остановимся. Давай, разбежимся до следующего кода? И мы отдохнем, и люди от нас. ОК?
Автор: aidomars
Дата сообщения: 30.08.2012 23:22
Ненене, я только зашел, а тут столько интересного, продолжайте позязя!
Автор: kser
Дата сообщения: 06.09.2012 10:38
День добрый! Прошу помощи.

Есть файл, на первую страницу которого помещается общая выборка из базы, далее макрос делает выборки из общего перечня анализируемой информации по параметрам, и раскидывает их по страницам книги (Регионы), но возникла потребность в том, чтоб макрос, помимо вставки выборки на страницу книги, ещё и вставлял эту же выборку в отдельный (одноимённый) файл. Как это сделать я не знаю, порылся по нету, но т.к. опыт мой в использовании VBA равен нулю, ничего сделать не смог.

Ранее в мне очень помог psiho, но сейчас, насколько я понял его на форуме нет (отправил сообщение в личку).

Вот фрагмент кода, окажите посильную помощь пожалуйста.


Код:

With Worksheets("ДАННЫЕ ПО Report").Range("A1:I1")
.AutoFilter Field:=8, Criteria1:="<>*СЦ*", Operator:=xlAnd
.AutoFilter Field:=3, Criteria1:="БЕЛГОРОД СЦ"
End With
With ActiveSheet.AutoFilter.Range
On Error Resume Next
Set rng = .Offset(1, 0).Resize(.Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
End With
If Not rng Is Nothing Then
Set rng = ActiveSheet.AutoFilter.Range
Rk0 = Worksheets("Белгород").Columns("A").Rows(1048576).End(xlUp).Row
rng.Offset(1, 0).Resize(rng.Rows.Count - 1).Copy Destination:=Worksheets("Белгород").Cells(Rk0 + 1, 1)
Rk = Worksheets("Белгород").Columns("A").Rows(1048576).End(xlUp).Row
If Rk0 > 0 Then
Worksheets("Белгород").Range(Worksheets("Белгород").Cells(Rk0 + 1, 1), Worksheets("Белгород").Cells(Rk, 9)).BorderAround ColorIndex:=1, LineStyle:=xlContinuous, Weight:=xlMedium
End If
Set rng = Nothing
End If
Автор: aidomars
Дата сообщения: 08.09.2012 11:29
kser
После вставки копируй лист в другую книгу, сохраняй и закрывай.

Код: ActiveWorkbook.Sheets("list").Copy
Автор: kser
Дата сообщения: 08.09.2012 20:26
aidomars
Спасибо, но все немного сложнее, нужно чтоб именно диапазон обработанный макросом, дописывался в файл нарастающим итогом (сотрудники из регионов будут вносить в эти файлы даты поступления, т.е. если я полностью скопирую страницу в файл, внесенная информация затрется).
Автор: kser
Дата сообщения: 09.09.2012 16:39
Вот код (в продолжение моего вопроса), вроде работает (добавил строки выделенные красным). Специалисты, посмотрите пожалуйста, и если есть явные косяки, помогите подправить.


Код: With Worksheets("ДАННЫЕ ПО Report").Range("A1:H1")
.AutoFilter Field:=8, Criteria1:="<>*СЦ*", Operator:=xlAnd
.AutoFilter Field:=3, Criteria1:="БЕЛГОРОД СЦ"
End With
With ActiveSheet.AutoFilter.Range
On Error Resume Next
Set rng = .Offset(1, 0).Resize(.Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
End With
If Not rng Is Nothing Then
Set rng = ActiveSheet.AutoFilter.Range
Rk0 = Worksheets("Белгород").Columns("A").Rows(1048576).End(xlUp).Row
rng.Offset(1, 0).Resize(rng.Rows.Count - 1).Copy Destination:=Worksheets("Белгород").Cells(Rk0 + 1, 1)
Rk = Worksheets("Белгород").Columns("A").Rows(1048576).End(xlUp).Row
If Rk0 > 0 Then
Worksheets("Белгород").Range(Worksheets("Белгород").Cells(Rk0 + 1, 1), Worksheets("Белгород").Cells(Rk, 9)).BorderAround ColorIndex:=1, LineStyle:=xlContinuous, Weight:=xlMedium
End If
Set rng = Nothing
Set rng = ActiveSheet.AutoFilter.Range
Rk0 = Workbooks.Open(ThisWorkbook.Path + "\" + "Белгород.xlsx").Worksheets("Белгород").Columns("A").Rows(1048576).End(xlUp).Row
rng.Offset(1, 0).Resize(rng.Rows.Count - 1).Copy Destination:=Workbooks("Белгород.xlsx").Worksheets("Белгород").Cells(Rk0 + 1, 1)
Rk = Workbooks("Белгород.xlsx").Worksheets("Белгород").Columns("A").Rows(1048576).End(xlUp).Row
If Rk0 > 0 Then
Workbooks("Белгород.xlsx").Worksheets("Белгород").Range(Worksheets("Белгород").Cells(Rk0 + 1, 1), Worksheets("Белгород").Cells(Rk, 9)).BorderAround ColorIndex:=1, LineStyle:=xlContinuous, Weight:=xlMedium
End If
Workbooks("Белгород.xlsx").Save
Workbooks("Белгород.xlsx").Close

Set rng = Nothing
End If
Автор: psiho
Дата сообщения: 10.09.2012 07:53

Цитата:
Специалисты, посмотрите пожалуйста, и если есть явные косяки, помогите подправить.

Смотри личку
Автор: kser
Дата сообщения: 19.09.2012 19:33
psiho
В очередной раз огромное вам спасибо!!!
Автор: komputeryuzer
Дата сообщения: 20.09.2012 11:44
нарот как ссылаться к ячейкам если в именя файла использовать как переменную?
типа вот так

дим а ас стринг
set a="othet.xls"
a2 = a!а2 вот тут как? вот так а&"!a2" ?
Автор: psiho
Дата сообщения: 20.09.2012 12:32

Цитата:
вот тут как? вот так а&"!a2" ?

Ещё лист нужно указывать. Вот так, например:

Код:
Dim ПутьКФайлу as String, ИмяФайла as string, ИмяЛиста as String,АдресЯчейки as String
ПутьКФайлу="C:\МоиДокументы\"
ИмяФайла="otchet.xls"
ИмяЛиста="Лист1"
АдресЯчейки="B1"
Range("A1").Formula="'" & ПутьКФайлу & "[" & ИмяФайла & "]" & ИмяЛиста & "'!" & АдресЯчейки
Автор: komputeryuzer
Дата сообщения: 20.09.2012 13:09
psiho у меня всё работает вот так ActiveCell.Value = "=" & b & "!R9C2"
но сажает блин формулу!! как сдеать чтобы значения сели ?
координаты ячеек откуда поступают данные жёсткие и заранее известны...
токо название самого файла меняется ежедневно (поэтому нужна перемнная)


Добавлено:
токо через копи-пасте ? нарямую нельзя?
Автор: notaltr
Дата сообщения: 20.09.2012 14:13
andrewkard1980:

Цитата:

Код: sURL = "http://nbrb.by/statistics/Rates/RatesPrint.asp?fromDate=2012-1-12"
Set oHttp = CreateObject("MSXML2.XMLHTTP")
With oHttp
.Open "GET", sURL, False
.Send
sHtml = .responseText
End With

Получите код странички в переменной sHtml, и дальше функциями mid и instr ищете нужную часть строки и выводите в нужную Вам ячейку.
Автор: andrewkard1980
Дата сообщения: 20.09.2012 16:13
Нет, не 250 - а весь. Посмотрите код НТМL страницы, найдите нужный Вам кусок, а потом сделайте так:
sHtml =mid(sHtml,instr(1,sHtml,"нужный Вам тег или слово"))
Msgbox(sHtml)


Добавлено:
Например так:

Код:
Sub GetTextFromHTML()
sURL = "http://nbrb.by/statistics/Rates/RatesPrint.asp?fromDate=2012-1-12"
Set oHttp = CreateObject("MSXML2.XMLHTTP")
With oHttp
.Open "GET", sURL, False
.Send
sHtml = .responseText
End With

sHtml = Mid(sHtml, InStr(1, sHtml, "USD"), 1000)
MsgBox (sHtml)
End Sub
Автор: andrewkard1980
Дата сообщения: 21.09.2012 11:51
komputeryuzer
Может потом вставить значение так:
ActiveCell.Value = ActiveCell.Value

Добавлено:
Либо сразу вот так:
ActiveCell.Value = Worksheets(b).Cells(9, 2)
Автор: psiho
Дата сообщения: 21.09.2012 13:15

Цитата:
но сажает блин формулу!! как сдеать чтобы значения сели ?

komputeryuzer, нужно убить формулу. В моём коде делается это вот так:

Код: Range("A1").Copy
Range("A1").PasteSpecial Paste:=xlPasteValues
Автор: notaltr
Дата сообщения: 24.09.2012 15:49
andrewkard1980

Цитата:
Например так:

Вот я лошара - смотрел в Watches Value sHtml, а там оно не полностью отображается. Все работает, огромное спасибо!

Автор: ol7ca
Дата сообщения: 25.09.2012 05:06
Здравствуйте!
Подскажите, как записать в VBA формулу =+COUNTIF(List!B:B, "<=30" )? Что-то не идет никак(
Буду признателен за помощь.
Автор: zippun
Дата сообщения: 25.09.2012 08:42
ol7ca
WorksheetFunction. Хэлп:

Цитата:
WorksheetFunction Object

Used as a container for Microsoft Excel worksheet functions that can be called from Visual Basic.

Use the WorksheetFunction property to return the WorksheetFunction object. The following example displays the result of applying the Min worksheet function to the range A1:A10.

Set myRange = Worksheets("Sheet1").Range("A1:C10")
answer = Application.WorksheetFunction.Min(myRange)
MsgBox answer

http://www.planetaexcel.ru/forum.php?thread_id=3313
Автор: SAS888
Дата сообщения: 25.09.2012 11:26
ol7ca
Например, так:

Код: [D1].Formula = "=COUNTIF(Лист1!B:B,""<=30"")"
Автор: zippun
Дата сообщения: 25.09.2012 14:45
На лист поступают данные через DDE, считаются формулами листа и пишутся на другой лист в этой же книге.

Код: Private Sub Worksheet_Calculate()
l_Counter = l_Counter + 1: l_Cnt = l_Cnt + 1
With Sheets(2)
.Cells(l_Cnt, 2).Value = Time
.Cells(l_Cnt, 3).Value = l_Counter
.Cells(l_Cnt, 4).Value = lCrBp
.Cells(l_Cnt, 5).Value = lCrAp
.Cells(l_Cnt, 6).Value = Cells(6, 22)
.Cells(l_Cnt, 7).Value = Cells(6, 17)
End With
End Sub

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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