Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Basic / VBA


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Megaloman
Статус: Практикант
Рейтинг: 296
∙ повысить рейтинг >>
Тимошенко Дмитрий
Статус: Студент
Рейтинг: 293
∙ повысить рейтинг >>
Чичерин Вадим Викторович
Статус: 10-й класс
Рейтинг: 266
∙ повысить рейтинг >>

∙ / КОМПЬЮТЕРЫ И ПО / Языки программирования / Basic/VBA

Выпуск № 916 от 20.07.2009, 22:05
Администратор рассылки: Калашников О.А., Руководитель
В рассылке: подписчиков - 362, экспертов - 91
В номере: вопросов - 2, ответов - 4

Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
оценить выпуск >>

Вопрос № 170454: Здравствуйте Эксперты!! в текстовом файле храниться информация вот в таком виде : 000018,#04-09_000018_domashniu_OBN__015s.avi,15,Привет мой свет!,20042009 000019,#04-09_000019_Vekom_Bank_015s.avi,15,вклад весенняя капель до 1 мая,21...


Вопрос № 170459: Мелочь конечно, но споткнулся... в VBA что бы запустить свой модуль надо ввести Application.Run "имя модуля" как тоже самое сделать в Microsoft Visual Basic ...

Вопрос № 170454:

Здравствуйте Эксперты!!

в текстовом файле храниться информация вот в таком виде :

000018,#04-09_000018_domashniu_OBN__015s.avi,15,Привет мой свет!,20042009
000019,#04-09_000019_Vekom_Bank_015s.avi,15,вклад весенняя капель до 1 мая,21042009
000022,#04-09_000022_Reiting_Pro_015s.avi,15,#Reiting Pro 15c,21042009
000023,#04-09_000023_Konfiskat_010s.avi,10,Распродажа осень зима лето -10%,22042009
000024,#04-09_000024_Evropeyski Stil_Leto_015s.avi,15,#Evropeyski Stil_Leto_15c,22042009
000020,#04-09_000020_Mir_Detstva_010s.avi,10,Акция -при покупке на 500 Хагис в подарок,21042009
000021,#04-09_000021_Region_Plus_010s.avi,10,#Region Plus_10c_3,21042009


(запятая разделитель)

Подскажите пожалуйста как отсортировать их по возрастанию или по убыванию .
причём критерий сортировки может быть по любой из подстрок и количество подстрок в строках будет разным (разным, это в смысле в каждой строке будет одинаковое количество подстрок но не 5 как в примере)

Спасибо заранее


Отправлен: 15.07.2009, 15:34
Вопрос задал: Lexap, Посетитель
Всего ответов: 2
Страница вопроса >>


Отвечает Megaloman, Практикант :
Здравствуйте, Lexap.
Идея решения - переписываем исходный текстовый файл в общий массив (число элементов = числу строк), выделяем во вспомогательный массив той же длины необходимую подстроку из каждой строки, организуем индексный массив, сортируем этот массив таким образом, чтобы он содержал последовательность индексов элементов вспомогательного (а, следовательно, и общего) массива в отсортированном порядке. Записываем общий массив в текстовый файл в соответствии с порядком в индексном массиве.
Код:
' В Указанном текстовом файле отсортируем строки по указанной подстроке

InFile = "D:\Примеры макроса\Для сортировки 10000.txt" ' Путь к текстовому файлу

Set FSO = CreateObject("Scripting.FileSystem Object")

OutOrder = 0 ' =0 Сортируем по возрастанию, не 0 - по убыванию
iSort = 4 ' Сортируем по указанному номеру подстроки
Delim = "," ' Символ разделителя
InSave = 1 ' =0 -Не сохраним копию исходного файла, не 0 -сохраним

' Если надо сохранить исходный файл в .bak

If InSave <> 0 Then
On Error Resume Next
Set F1 = FSO.GetFile(InFile)
If Err.Number = 0 Then
F1.Copy InFile + ".bak"
F1.Close
End If
End If

' Читаем исходный файл в массив
On Error Resume Next
Set F1 = FSO.OpenTextFile(InFile, 1, False)

If Err.Number = 0 Then
Messa = CStr(Time) + " Сортировка начата" + Chr(13) + Chr(1 0)
iString = F1.ReadAll()
F1.Close
iString = Replace(iString, Chr(10), "")
Mass = Split(iString, Chr(13))
iString = ""
N = UBound(Mass)

' Выделяем в отдельный массив подстроки, по которым сортируем, и массив индексов

ReDim MSort(N), MIndex(N)
For i = 0 To N

MIndex(i) = i
iMass = Split(Mass(i), Delim)
M = UBound(iMass)
sString = ""
If 1 <= iSort And iSort <= M + 1 Then sString = iMass(iSort - 1)
MSort(i) = sString
Next

' Сортируем массив подстрок в индексном массиве
' Записываем в файл исходный массив в отсортированном порядке

Set F1 = FSO.OpenTextFile(InFile, 2, True)

L = (OutOrder = 0)
iString = ""

For i = 0 To N
For j = i To N
If L Then
' LL = (StrComp(MSort(MIndex(i)), MSort(MIndex(j))) = 1)
LL = MSort(MIndex(i)) > MSort(MIndex(j))
Else
' LL = (StrComp(MSort(MIndex(i)), MSort(MIndex(j))) = -1)
LL = MSort(MIndex(i)) < MSort(MIndex(j))
End If
If LL Then
k = MIndex(i)
MIndex(i) = MIndex(j)
MIndex(j) = k
End If
Next
If Trim(Mass(MIndex(i))) <> "" Then ' Если надо, чтобы после последней строки не было символа конца строки
F1.Write (iString + Mass(MIndex(i)))
iString = Chr(13) + Chr(10)
End If
' If Trim(Mass(MIndex(i))) <> "" Then F1.WriteLine (Mass(MIndex(i))) ' Если надо, чтобы и после последней строки был символ конца стро ки

Next

F1.Close
Messa = Messa + CStr(Time) + " Сортировка завершена"

Else
Messa = "Ошибка при открытии файла " + Chr(13) + Chr(10) + InFile + Chr(13) + Chr(10) + Err.Description

End If
L = MsgBox(Messa, 0, "Сортировка")


Приведенный код может быть использован как в макросе Excel, так и в качестве vbs-скрипта.
Следует заметить, что на моём компьютере (P4 -2.4ГГц) под Excel 10000 записей сортировались менее минуты. VBS скрипт то же проделывал минут за 5. По видимому, время будет сильно зависеть от длины подстроки, по которой сортируем. У меня был 51 символ (при общей длине строк с разделителями 200 символов). Объем файла составил около 2 мегабайтов.
Выкачать готовый скрипт можно здесь
-----
Нет времени на медленные танцы

Ответ отправил: Megaloman, Практикант
Ответ отправлен: 16.07.2009, 01:49

Оценка ответа: 5

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 252209 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает HookEst, Специалист :
    Здравствуйте, Lexap.
    Еще вариант для примера:
    Здесь для хранения прочитанных строк я использовал Collection, для работы с файлами использовал не FSO, а "старый" способ Open/Input/Print. Ну и сортирую я строки сразу, во время чтения: двоичным поиском нахожу место, где она должна стоять в Collection, туда и вставляю. В результате, когда файл прочитан, в Collection будут все строки этого файла, в нужном нам порядке. Осталось их только записать... PROFIT.

    аргументы SortFile:
    srcPath As String - путь к файлу, откуда читаем;
    dstPath As String - путь к файлу, куда пишем (может быть тем же, что и srcPath);
    Delimiter As String - разделитель значений в строке(разделитель строк такой же как для Line Input# vbCr или vbCrLf);
    SortValueIndex As Long - индекс значения по которому сортируем (с 0!)

    Поиск и вставку вынес в Sub Insert...


    Успехов.

    Приложение:

    Ответ отправил: HookEst, Специалист
    Ответ отправлен: 17.07.2009, 02:01

    Оценка ответа: 5

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 252249 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Вопрос № 170459:

    Мелочь конечно, но споткнулся...

    в VBA что бы запустить свой модуль надо ввести Application.Run "имя модуля"

    как тоже самое сделать в Microsoft Visual Basic

    Отправлен: 15.07.2009, 17:15
    Вопрос задал: Lexap, Посетитель
    Всего ответов: 2
    Страница вопроса >>


    Отвечает Витер Александр Анатольевич, 3-й класс :
    Здравствуйте, Lexap.
    С помощью Application.Run вы запускаете не модуль на выполнение — это невозможно — а определенную процедуру. При этом, можно указывать имя модуля, в котором располагается процедура.

    Чтобы иметь возможность вызвать процедуру из другого модуля, эта процедура должна быть объявлена как Public. Например, в модуле есть процедуры, объявленные таким образом:
    Public Sub Proc1()
    End Sub

    Private Sub Proc2()
    End Sub

    Sub Proc3()
    End Sub

    Тогда из другого модуля можно будет запустить только процедуры Proc1 (объявлена как Public) и Proc3 (не указана область действия процедуры, но Public по-умолчанию)

    Чтобы запустить процедуру на выполнение, нужно просто написать ее имя.
    Или использовать оператор Call <имя_процедуры>
    -----
    Лучше день потерять - потом за пять минут долететь!

    Ответ отправил: Витер Александр Анатольевич, 3-й класс
    Ответ отправлен: 15.07.2009, 17:38

    Оценка ответа: 5

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 252202 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Филатов Евгений Геннадьевич, Студент :
    Здравствуйте, Lexap.

    Может мне и засчитают этот ответ как повторение предыдущего участника, но опишу немного подробнее.

    Программа пользователя выполняет код, написанный в основной процедуре.
    В Basic можно использовать несколько видов внешних ( по отношению к выполняемой в данный момент процедуре ) программ - процедуры и функции. Различие небольшое, но основное в том, что функция обычно возвращает какое-либо значение, а процедуру можно использовать как самостоятельный модуль.

    В связи с ограничением размера программного кода в исходниках ( и для удобства программирования ) всю программу можно разбить по отдельным модулям ( мне уже писало, что модуль не может быть сохранен из-за слишком большого размера программного кода в нем и приходилось несколько процедур переносить в новый модуль) . В модуле формы описывается внешний вид формы, находящиеся на ней кнопки, списки, текст, поля ввода и многое другое. После выбора пользователем запускается обработчик события, находящийся внутри этой формы. И как раз в этот момент есть возможность внутри обработчика вызывать внешние процедуры и функции.

    Для примера работы с функцией, пусть будет форма Form1 , на которой расположено поле ввода Text1 , строка вывода Label1 и кнопка Command1.
    Обработка событий ввода значения в поле ввода и нажатия кнопки расположена в самой форме, функция находится в модуле Module1 под именем rou_nd.
    Если бы функция располагалась в том же модуле, в котором расположена процедура, из которой она вызывалась, то можно было бы ее объявить как Private Function ( "личная" ) . Если же она будет в другом модуле ( как в примере ) , то должна быть объявлена Public Function ( "общая" ) .
    Пользователь вводит в поле число, которое нужно преобразовать в строку с округлением до двух знаков после запятой и вывести полученное значение в строку вывода. Для обработки используем пользовательскую функцию ( Пример 1) .


    Это же задание можно сделать с использованием внешней процедуры ( Пример 2 ) . Процедура сама берет введенное в поле значение, преобразует и присваивает его строке на форме.

    С уважением.

    Приложение:

    Ответ отправил: Филатов Евгений Геннадьевич, Студент
    Ответ отправлен: 20.07.2009, 21:31

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 252394 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
    оценить выпуск >>

    подать вопрос экспертам этой рассылки >>

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров >>

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.5 от 08.07.2009

    В избранное