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

» Excel VBA (часть 3)

Автор: psiho
Дата сообщения: 20.08.2012 12:58

Цитата:
Второй - отмолчался

Не хотел офтопить.


Цитата:
Про то, как ты по моим постам себе репу склеиваешь и умняк гонишь

Так каждого обвинить можно. Во-первых,никто за тобой г..но не подметает. Во-вторых, ты здесь не модератор и ,тем более, не "хозяин" ветки.


Цитата:
AND с локалью

Run-time error '1004' может быть связана не только с "Макрос не найден".


Цитата:
Debug.Print Err.Number & " - "; Err.Description

Этот товарищ может и не знает где это должно выводиться. Ему нужно, чтобы выдалось предупреждение или код продолжал работать.



Автор: grbdv
Дата сообщения: 20.08.2012 13:05

Цитата:
Цитата:AND с локалью
Run-time error '1004' может быть связана не только с "Макрос не найден".

Ты чо буксуешь?! Локаль! Локаль!

Да и откуда там 1004-й еще взяться в такой постановке задачи?! Ты хоть реалиями оперируй. Ты в Сочи тоже с дубленкой едешь? Вдруг снег? Вдруг - игры олимпийские :)


Цитата:
Этот товарищ может и не знает

Товарищ - молчит. А шапку ты прочел?! Ты-то с твоим послужным наизусть должен ее знать. В просак его еще лизни. Посмотри - как Мишель себя ведет...

Не умеешь писать-произносить "говно" - не пиши вообще.


Автор: surgutfred
Дата сообщения: 23.08.2012 19:47
Прошу помощи.
Есть макрос, который смотрит в папке файлы по маске, вытаскивает в один столбик дату, а в другой время создания.
Мне нужно отсортировать и по дате и по времени. Я сделал так:

Range("B5:E50").Sort Key1:=Range("D1"), Order1:=xlAscending, Key2:=Range("E1"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

где солбец D - дата, а столбец E - время.
Работает все ок, кроме тех файлов у которых время создания меньше 10 часов, т.е вот так:
10:50:00
11:15:00
11:53:02
9:14:02
Как мне лучше перед девяткой 0 поставить, что бы она встала в начале списка? Я так понимаю как то с форматами играться надо?

Время создания получаю так:
ВремяСоздания = Right(FileDateTime(ПутьКФайлу), 8)
9:14:02 получается с впереди идущим пробелом, как вместо него приписать 0?
Автор: grbdv
Дата сообщения: 23.08.2012 19:56
surgutfred
Ты пишешь время (а может и дату?), как текст. Тогда самое простое и эффективное:
sTime = Format(sTime, "hh:mm:ss")
Автор: surgutfred
Дата сообщения: 23.08.2012 20:25

Цитата:
sTime = Format(sTime, "hh:mm:ss")

Спасибо, в таблице отображается 09:26:02, но в строке формул видно по старому 9:26:02 и сортировка не срабатывет, т.е только видимость. Как же правильно отсортировать то?
Автор: grbdv
Дата сообщения: 23.08.2012 20:29
surgutfred
Значит, часть ячеек у тебя имеет формат время, а часть - текст. Надо не дать возможности Екселю самому манипулировать форматом ячеек. Он очень умный. Для этого, перед заполнением ячеек надо, чтобы они имели формат текст. Переменные тоже должны быть явно объявдены, как строковые. Нужно видеть код.
Автор: surgutfred
Дата сообщения: 23.08.2012 20:33

Цитата:
Нужно видеть код.

Вот файл
http://narod.ru/disk/59874791001.7451de3c3bf8e039ba7ea63d28e9734e/USR.xls.html
Автор: grbdv
Дата сообщения: 23.08.2012 21:29
surgutfred
Для начала самой первой строкой помести Option Explicit
После этого явно продекларируй все необъявленные переменные с указанием типа данных. В частности:
Dim ДатаСоздания$, ВремяСоздания$

Но, дальше, все равно
Array(НомерФайла, ИмяФайла, ПутьКФайлу, ДатаСоздания, ВремяСоздания)
вернет все как Variant. Надо по-другому заполняться.
Автор: surgutfred
Дата сообщения: 23.08.2012 21:48

Цитата:
Надо по-другому заполняться.


Спасибо за труд, но как говорится не стоит овчинка.... Так буду юзать.
Автор: grbdv
Дата сообщения: 24.08.2012 01:14
surgutfred
Ну, дело хозяйское... Допилить-то там не так уж много. Спрашивай, вобщем, если надумаешь.
Автор: gogaman
Дата сообщения: 28.08.2012 17:51
Привет. Кому не сложно сваять макрос для изменения числа в ячейке на 0,005 (-) а то уже замахался в ручную. применяеться не ко всему масиву а выборочно помню бвло что то такое кнопка висела выбрал ячейки нажал изменилось. сейчас найти не могу чтоб подправить под новые нужды.
Автор: grbdv
Дата сообщения: 28.08.2012 18:00
gogaman, ничо не понял... :(
Разрядность поменять? Представление числа? Какой, млин, массив?
Автор: gogaman
Дата сообщения: 28.08.2012 18:29
grbdv
есть таблица куча строк 5 столбов и там даные типа 122,455 надо изменить на 122,450
уменьшение фиксированое всегда на 0,005
Автор: grbdv
Дата сообщения: 28.08.2012 18:46
gogaman
Понял :) Чуть позже отпишусь, если никто больше не положит. Там пару строк.

Добавлено:
gogaman
Ниже код модуля. Процедуры sb_Change_UP и _DN надо повесить на пользовательские кнопки. Фиксированное приращение регулирется константой CHSIZE.

Никаких проверок нет! Ни на содержание ячеек, ни на корректность выделения. Что выделишь - то и премолет. Мякину заложишь - мякину получишь. Enjoy.

[more=Код:]

Код: Option Explicit

Private Const TRPos% = 1
Private Const TRNeg% = -1
Private Const TRZer% = 0

Private Const CHSIZE! = 0.5

Private rSel As Range
Private i&, lCnt&
Private nValPre!, nValNew!
'

Public Sub sb_Change_UP()
Call sb_Change(TRPos)
End Sub
Public Sub sb_Change_DN()
Call sb_Change(TRNeg)
End Sub
Public Sub sb_Change_ZR()
Call sb_Change(TRZer)
End Sub
Private Sub sb_Change(pUpDn%)
Set rSel = Selection
With rSel
lCnt = .Count
For i = 1 To lCnt
nValPre = .Item(i).Value
nValNew = (nValPre * pUpDn + CHSIZE) * pUpDn
.Item(i).Value = nValNew
Next
End With
End Sub
Автор: Maximus777
Дата сообщения: 29.08.2012 07:58
Я бы сделал вот так:

Код: Sub Macro()
For i = 1 To 5 'Строки
For j = 1 To 4 'Столбцы
txt = Right(CStr(Cells(i, j)), 1)
If txt = "5" Then Cells(i, j).Value = Cells(i, j) - 0.005
Next j
Next i
End Sub
Автор: grbdv
Дата сообщения: 29.08.2012 08:14
Maximus777
Цитата:
Я бы сделал вот так:

Я бы так даже теще не стал бы делать.

Переменные за тебя кто будет декларировать? Все в Variant?

И почему именно заканчивающиеся на 5?
Почему по пяти строкам?
Почему по всем четырем столбцам?

Читай ТЗ:

Цитата:
применяеться не ко всему масиву а выборочно помню бвло что то такое кнопка висела выбрал ячейки нажал изменилось


И почему в левой части явно указано, к чему обращаешься, а в правой - дефолт? Уж или Вася, или не Вася...
Cells(i, j).Value = Cells(i, j) - 0.005

Два раза подряд обращаться к одной и той же ячейке - моветон. Для этого есть переменные.
Right(CStr(Cells(i, j)), 1)
Cells(i, j) -

А в обратную сторону мотануть, если неправильно нажал? Отката-то нет в VBA.

Короче, простота хуже воровства.
Автор: Maximus777
Дата сообщения: 29.08.2012 08:27
grbdv
Цитата:
И почему именно заканчивающиеся на 5?

Цитата:
есть таблица куча строк 5 столбов и там даные типа 122,455 надо изменить на 122,450

grbdv
Цитата:
Почему по пяти строкам?
Почему по всем четырем столбцам?

Автор задачи сам подставит туда значения своей "кучи строк и столбцов".

grbdv
Цитата:
Я бы так даже теще не стал бы делать.

Это чья проблема?
Автор: grbdv
Дата сообщения: 29.08.2012 08:39
Maximus777
Цитата:
Это чья проблема?

Твоя и чела, если он решит воспользоваться твоим "кодом". Даже язык не поворачивается :) Твое "решение" - для сугубо частного случая.

Мой код универсален, готов к работе в обе стороны на любых диапазонах. Надо только установить приращение - и все. Его дальше можно модернизировать и наращивать проверками.

И что тебе в нем не понравилось? Что тебя торкнуло не только написать, но и выложить это недоразумение?

Бзв, ты бортанул все вопросы по собственно коду. Засчитываем слив?



Автор: Maximus777
Дата сообщения: 29.08.2012 08:48
Если ему требуется не только "частный случай", то всё ещё проще:


Код: Sub Macro()
For i = 1 To 5
For j = 1 To 4
Cells(i, j) = Round(Cells(i, j), 2)
Next j
Next i
End Sub
Автор: grbdv
Дата сообщения: 29.08.2012 08:55
Maximus777
Если "вдоль", так фигали вообще отвечал?...

Хочешь позориться дальше - пеши естчо. Ты разберись вначале с Round, тем более на пятерках :)

? Round(122.455, 2)
? Round(122.445, 2)

Фшколу? Упроститель :))
Оброщайся, памагу дамашку зделадь.

Вопросы по коду остались открытми :)

Добавлено:

Цитата:
Если же я что-то не так понял и ему надо просто уменьшить все значения на 0,005, то я вообще не вижу никакой загвоздки. Говоря твоим языком, тёща сама напишет такой макрос.

Ты же видишь, что чел совсем не в курсах. Конечно, такой или подобный макрос и теща напишет. Но в данном случае-то нужно готовое решение. А это... макросом так и останется - не пришей к звезде рукафф :(

Был бы он в курсах - стал бы спрашивать сущую безделицу - как вычесть, как отнять разряд, как округлить... Он ведь даже диапазон массивом называет и со второго раза только произнес что хочет.. (gogaman - не в обиду)

Добавлено:
Это мы друг другу можем подсунуть краткий код без ничего, без обвязки, без смокинга. Лишь бы понятна мысль была. А тут-то - конечный пользователь...
Автор: Maximus777
Дата сообщения: 29.08.2012 09:14
grbdv
Цитата:
Если "вдоль", так фигали вообще отвечал?...

Это было сказано касаемо твоих подсчётов сливов.


Цитата:
? Round(122.455, 2)

ОК, не проблема, используй ROUNDDOWN(122.455, 2)


Цитата:
Вопросы по коду остались открытми


Цитата:
Переменные за тебя кто будет декларировать? Все в Variant?

Я их редко декларирую и никаких проблем не испытываю. Если кому-то это доставляет душевные мучения, то это не моя проблема.


Цитата:
И почему в левой части явно указано, к чему обращаешься, а в правой - дефолт? Уж или Вася, или не Вася...

А хз. Всё, что делается быстро, делается как попало. Но я тут не решения продаю, я просто мысль излагаю. Хочет чел воспользоваться, додумает. Или здесь лаборатория термоядерного синтеза?
Автор: grbdv
Дата сообщения: 29.08.2012 09:35

Цитата:
ОК, не проблема, используй ROUNDDOWN(122.455, 2)

Проблема. Проблема в том, что ты плохо знаешь язык. И путаешь ф-ции листа с ф-циями языка. А даже если бы и была такая, то распиши - когда применять ROUNDDOWN, а когда - ROUNDUP :)


Цитата:
Цитата:Переменные за тебя кто будет декларировать? Все в Variant?

Я их редко декларирую и никаких проблем не испытываю. Если кому-то это доставляет душевные мучения, то это не моя проблема.

Цитата:И почему в левой части явно указано, к чему обращаешься, а в правой - дефолт? Уж или Вася, или не Вася...

А хз. Всё, что делается быстро, делается как попало. Но я тут не решения продаю, я просто мысль излагаю. Хочет чел воспользоваться, додумает. Или здесь лаборатория термоядерного синтеза?


Я же выше означил - кому и для чего дается код. Если тебя не волнует, как код дальше будет работать, то нафига вообще засоряешь тему?

Поставь себе в подпись - переменные не декларирую, все в Variant, языка не знаю, за работоспособность и последствия не отвечаю.

Добавлено:
И, бзв, чтоб ты был в курсе, в ф-циях листа есть и нормально (по-школьному) округляющая ф-ция =ROUND. Только вот аналога ее в VBA нет.
Автор: gogaman
Дата сообщения: 29.08.2012 10:01
спасибо за отклик на просьбу
теперь дело пойдет веселее а то 200000 ячеек каждую печально
Автор: Maximus777
Дата сообщения: 29.08.2012 10:17
grbdv
Цитата:
Проблема. Проблема в том, что ты плохо знаешь язык. И путаешь ф-ции листа с ф-циями языка.

Да, ты прав, по дефолту такой функции нет. Но это не проблема.


Код: Public Function RoundDown(Arg1 As Double, Arg2 As Long) As Double
Dim wsf As Excel.WorksheetFunction
Set wsf = Excel.WorksheetFunction
RoundDown = wsf.RoundDown(Arg1, CDbl(Arg2))
End Function
Автор: grbdv
Дата сообщения: 29.08.2012 10:36
Травку я лучше покурю. Я и так весь изулыбался, так теперь еще и ржать буду над твоими выдумками :)

А вот тебе курит надо завязывать. Ты так и оставил в своем "коде" wsf.RoundDown и докатился аж до объявления wsf :)

А вообще - это стрем из VBA обращаться к функциям листа без крайней на то нужды.

Ладно. Я и так тебе бесплатный мастер-класс провел. Кури маны, читай факи. Вырабатывай почерк. И, не опоздай фшколу :)
Автор: Maximus777
Дата сообщения: 29.08.2012 10:43
grbdv
Цитата:
Травку я лучше покурю.

Вряд ли это лучше, ибо наглядно видно, к чему это приводит:

Цитата:
Я и так весь изулыбался, так теперь еще и ржать буду над твоими выдумками
Автор: grbdv
Дата сообщения: 29.08.2012 11:04
Maximus777
Ну ладно, смотри, несмышленыш:

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

А ты свою перенеси в Ворд? Будешь Ексель подключать? Да свалишь еще это на плечи заказчика? Я уж про все остальное молчу. Выше сказано...

А представь, будет не пять, а пятьсот строк кода? Все. Ты приплыл. И твой заказчик - тоже. Здесь - играть, здесь - не играть, тут рыбу заворачивали...
Автор: panda3
Дата сообщения: 30.08.2012 08:37
gogaman

Цитата:
Привет. Кому не сложно сваять макрос для изменения числа в ячейке на 0,005 (-)


Для нестрадающих гигантоманией (во всех смыслах) можно использовать такой код:

Код: Public Sub DecreaseCells()
Dim c As Range
For Each c In Selection.Cells
c = c - 0.005
Next c
End Sub
Автор: Maximus777
Дата сообщения: 30.08.2012 13:27
panda3
очень красивый вариант.
Автор: aidomars
Дата сообщения: 30.08.2012 17:40
А так красивше?)

Код: Selection = -0.005

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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