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

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


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

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

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

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

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

Выпуск № 915 от 19.07.2009, 21:35
Администратор рассылки: Калашников О.А., Руководитель
В рассылке: подписчиков - 362, экспертов - 91
В номере: вопросов - 2, ответов - 2

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

Вопрос № 170423: Доброе время суток Подскажите пожалуйста как при помощи VBA Excel из текстового файла удалить или заменить (например 2-ю) строку полностью. и как заменить или удалить данные которые находятся между разделителями в строке (разделитель &qu...


Вопрос № 170436: В документ ворд вставляю ComboBox Где прописать и как, чтобы при печати не было видно квадратика выбора со стрелкой? <...

Вопрос № 170423:

Доброе время суток

Подскажите пожалуйста как при помощи VBA Excel из текстового файла удалить или заменить (например 2-ю) строку полностью.
и как заменить или удалить данные которые находятся между разделителями в строке (разделитель ",")

текстовый файл имеет вот такой вид:

000014,#04-09_000014_Vesta_Mebel_Obn_010s.avi,10,Vesta Mebel Obn,20.04.2009
000015,#04-09_000015_Vesta_Mebel_kaluga_010s.avi,10,Vesta Mebel kaluga_10c,20.04.2009
000017,#04-09_000017_domashniu2_OBN__015s.avi,15,domashniu2_OBN_15c,20.04.2009
000018,#04-09_000018_domashniu_OBN__015s.avi,15,domashniu_OBN_15c,20.04.2009

Заранее благодарен

Отправлен: 14.07.2009, 12:50
Вопрос задал: Lexap, Посетитель
Всего ответов: 1
Страница вопроса >>


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

1.В указанном текстовом файле удалим указанную по номеру строку
Вот текст макроса
Код:
Sub del_row_txt()
' В указанном текстовом файле удалим указанную по номеру строку

InFile = "D:\Примеры макроса\Текстовый файл.txt" ' Путь к текстовому файлу
iDelete = 2 ' Какую строку удалить
InSave = 0 ' =0 -Не сохраним копию исходного файла, не 0 -сохраним

Set FSO = CreateObject("Scripting.FileSystemObject")
Set F1 = FSO.OpenTextFile(InFile, 1, False)
Set F2 = FSO.OpenTextFile(InFile + ".tmp", 2, True)

' Переписываем исходный файо в .tmp файл без указанной строки

j = 0

Do
On Error Resume Next
iString = F1.ReadLine()
If Err.Number <> 0 Then Exit Do
j = j + 1
If j <> iDelete Then F2.WriteLine (iString)
Loop

F1.Close
F2.Close

' Если надо сохранить исходный файл в .bak
If InSave <> 0 Then

On Error Resume Next
Set F1 = FSO.GetFile(InFile + ".bak")
If Err.Number = 0 Then
F1.Delete True
End If

Set F1 = FSO.G etFile(InFile)
F1.Name = F1.Name + ".bak"
F1.Close

End If

' Переносим .tmp файл вместо исходного
Set F2 = FSO.GetFile(InFile + ".tmp")
F2.Copy InFile, True
F2.Delete True

End Sub

В первых строках укажите Ваши данные для задачи.
Если хотите, чтобы код работал как отдельный скрипт, перенесите приведенный кода в блокнот, но только без строк

Sub .....

End Sub

Текст должен быть в Windows-кодировке (критично, если в именах файлов присутствуют русские буквы)
Сохраните полученное в текстовый файл с расширением .vbs, например del_row_txt.vbs
Запускайте его как обычный исполнимый файл, ничего в систему дополнительно устанавливать не нужно.

2. В указанном текстовом файле заменим подтекст в строке, отделяемый разделителями
При этом возможна замена на пустую подстроку (при желании с удалением соответствующего разделителя),
что эквивалентно удалению подтекста.
В Вашем примере 4 разделителя (запятые) отделяют 5 подстрок
Любую из них можно заменить, указав её номер по счёту.
Аналогично первому решению, его можно использовать как vbs-скрипт.
Код:
Sub repl_txt()
' В указанном текстовом файле заменим подтекст в строке, отделяемый разделителями

InFile = "D:\Примеры макроса\Для замены.txt" ' Путь к текстовому файлу
Delim = "," ' Символ разделителя
iRepl = 2 ' Какой по счету кусок в строке меняем
sRepl = "Привет мой свет!" ' На что этот кусок меняем
iBlank = 0 ' Если =0 и Если текст для замены пустой, то убираем и разделитель

InSave = 1 ' =0 -Не сохраним коп ию исходного файла, не 0 -сохраним

Set FSO = CreateObject("Scripting.FileSystemObject")
Set F1 = FSO.OpenTextFile(InFile, 1, False)
Set F2 = FSO.OpenTextFile(InFile + ".tmp", 2, True)

' Переписываем исходный файл в .tmp файл, делая замены

L = (Len(sRepl) = 0)
Do
On Error Resume Next
iString = F1.ReadLine()
If Err.Number <> 0 Then Exit Do
Mass = Split(iString, Delim)
N = UBound(Mass)
iString = ""
For i = 0 To N
If i <> iRepl - 1 Then
iString = iString + Mass(i)
If i <> N Then iString = iString + Delim
Else
iString = iString + sRepl
If i <> N And Not (L And iBlank = 0) Then iString = iString + Delim
End If
Next

If Right(iString, 1) = Delim Then
iString = Mid(iString, 1, Len(iString) - 1)
End If

F2.WriteLine (iString)
Loop

F1.Close
F2.Close

' Если надо сохранить исходный файл в .bak
If InSave <> 0 Then

On Error Resume Next
Set F1 = FSO.GetFile(InFile + ".bak")
If Err.Number = 0 Then
F1.Delete True
End If

Set F1 = FSO.GetFile(InFile)
F1.Name = F1.Name + ".bak"
F1.Close

End If

' Переносим .tmp файл вместо исходного
Set F2 = FSO.GetFile(InFile + ".tmp")
F2.Copy InFile, True
F2.Delete True

End Sub

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

Ответ отправил: Megaloman, Практикант
Ответ отправлен: 14.07.2009, 23:06

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

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


    Вопрос № 170436:

    В документ ворд вставляю ComboBox
    Где прописать и как, чтобы при печати не было видно квадратика выбора со стрелкой?

    Отправлен: 14.07.2009, 18:56
    Вопрос задал: Lrad, Посетитель
    Всего ответов: 1
    Страница вопроса >>


    Отвечает Витер Александр Анатольевич, 3-й класс :
    Здравствуйте, Lrad.
    Могу предложить такой вариант. За отображение стрелки отвечает свойство ShowDropDownWhen, которое может принимать 3 значения: 0 - fmShowDropDownWhenNever (никогда не показывать), 1 - fmShowDropDownWhenFocus (показывать если курсор находится в этом элементе), 2 - fmShowDropDownWhenAlways (показывать всегда).
    Задача состоит в том, чтобы прятать при печати стрелочку, для этого нужно писать макрос, который будет перехватывать действия пользователя при печати, скрывать стрелочку, печатать и делать стрелочку видимой снова.
    Но я считаю, что лучше всего поставить значение fmShowDropDownWhenFocus и только не забывать выходить из компонента перед печатью.
    -----
    Лучше день потерять - потом за пять минут долететь!

    Ответ отправил: Витер Александр Анатольевич, 3-й класс
    Ответ отправлен: 14.07.2009, 20:51

    Оценка ответа: 5
    Комментарий к оценке:
    Как вариант это решение подойдет, но есть и другой выход. К сожалению я его не помню. Раньше у меня был шаблон и в нем был этот элемент, без макроса и без выхода из поля - печаталось без стрелки, но я его потерял

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


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

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

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

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

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

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

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


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

    В избранное