Страницы: 1
RSS
Почему один и тот же макрос, который просто загружает данные из текстового файла, ведет себя с разными файлами по-разному?
 
Добрый день!
Подскажите если знаете в чем кроется причина. Макрос загружает из текстового файла, в котором поля разделены точкой с запятой, таблички на листы Excel. Макрос для всех листов один и тот же. Текстовые файлы однотипные. Ну текст он и в Африке текст...
Так вот, на одном листе все загружается нормально, а на другом, вроде как добавляются колонки слева, в которые и происходит запись (это видно по кнопкам, которые уезжают вправо).

Для примера удалил все, что можно. Оставил только сам макрос (который был записан средствами Excel, с последующими незначительными изменениями).
В файле два листа, на каждом кнопка "загрузить".Лист test1 грузит из файла test1.txt,  а лист test2 - из файла test2.txt (имена листов соответствуют названию файлов) с test2 все нормально, a test1 глючит.

Прикладываю сам excel файл и ещё оба текстовых файла - все должны лежать в одной папке.
Да, в текстовых файлах текст - это просто символы юникода, поскольку текстовое (читаемое) содержимое должно быть зашифровано.
Сам макрос:
Код
Dim file_name As String

file_name = ThisWorkbook.Path & "\" & ActiveSheet.Name & ".txt"
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & file_name, Destination:=Range("$A$4:$N$100"))
    .Name = "Vertragsansicht_1"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = False
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 65001
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = True
    .TextFileCommaDelimiter = False
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
End With

Вот, собственно и все. Ума не приложу в чем дело...
 
vadi61, очевидно что при вашем виде шифрования не должно быть такой одинаковой последовательности ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Изменено: Marat Ta - 06.03.2021 22:45:00
 
Marat Ta,  спасибо за ответ! Да что-то очень длинно получилось. Проверю процедуру записи в файл.

Add. Но все равно не понятно, как длина (количество ячеек) может сдвигать кнопки
Изменено: vadi61 - 06.03.2021 21:52:12
 
vadi61, не самая лучшая идея загружать или хранить в ячейках в таком виде инфо. Смысл? Делайте декодирование блоками в памяти и потом уже в таблицу.
Изменено: Marat Ta - 06.03.2021 22:15:29
 
Marat Ta, я так и делаю. Я просто для примера все выбросил оставил только ту часть, которая выдавала не то что хотелось.
На самом деле Excel файл только показывает расшифрованное содержимое текстового файлы, а в случае добавления записи - зашифровывает и сохраняет уже зашифрованный текст в текстовом файле (видимо при этой записи в файл у меня и ошибка - сейчас проверяю где именно). Сам же Excel ничего в Excel-файлах не сохраняет - он пустой.
 
да, что-то не так с ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  в файле test1.txt
1. Если заменить файл test1.txt файлом test2.txt - то всё работает корректно на листе test1.txt.
Вывод - что-то не так с файлом test1.txt
2. Если в файле test1.txt удалит (сократить) строки ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; на одинарный ; - то всё работает и кнопки никуда не уезжают.
Вывод - что-то не так с файлом test1.txt

P.S. Почему кнопки из-за этого уезжают правее - не знаю
Изменено: New - 06.03.2021 23:58:09
 
Цитата
New написал:
Почему кнопки из-за этого уезжают правее - не знаю
Вот и я не знаю... Причем, алгоритм записи в файл в 9 случаях из 10 выдает правильный результат, а один раз вот такое удлинение. Но с алгоритмом я разберусь. Мне не ясно каков механизм влияния на смещение кнопок внутри Excel'я. Задача-то тривиальная строки с разделителями переносятся в Excel-таблицу. И какая разница сколько полей предопределено текстовым файлом.
 
Нажмите на вашей кнопке "Загрузить" на листе test1 правой клавишей мыши, далее меню Размер и Свойства, в открывшемся справа в окне меню выбрать "Свойства" -  переставить кружочек на "Не перемещать вместе с ячейками и не изменять размеры".
Повторите тоже самое для кнопки "Очистить"

P.S. Вот такой код
Код
Range("A4:N100").Select
Selection.ClearContents

лучше писать вот так
Код
Range("A4:N100").ClearContents
Изменено: New - 07.03.2021 00:22:13
 
Цитата
New написал:
Вот такой код
Да, спасибо. Действительно лишняя строка.

Спасибо, что ищете решение, но я уже исправил код записи в файл, так что все работает. Но вопрос остается: ПОЧЕМУ? это происходит из-за увеличения длины строки в текстовом файле.
 
vadi61, добавление 1 столбца происходит, если в файле Test1 оставить только 47 символов ;
На 2 столбца при 48 ;
Думайте в этом направлении.)
Изменено: Marat Ta - 07.03.2021 09:07:43
 
Цитата
Marat Ta написал:
Думайте в этом направлении.
Буду думать. Во всяком случае появилась "зацепка". Спасибо, большое
 
vadi61,  Чтобы легче думалось, сделал вам файл тест. Нажмите Загрузить 2 раза.... 3 раза... 4 раза....
Изменено: Marat Ta - 07.03.2021 16:56:04
 
Цитата
vadi61 написал:
ПОЧЕМУ? это происходит из-за увеличения длины строки в текстовом файле.
ПОТОМУ, что нужно убирать за собой мусор. :)

Откройте книгу из #1, меню Данные / подключения, выделите их все (> 30 штук) и нажмите кнопку "Удалить". Чудеса закончатся.
Изменено: sokol92 - 07.03.2021 15:09:56
Владимир
 
ув. sokol92, Спасибо, а как это сделать макросом, не подскажите?

Я сейчас удаляю только имена диапазонов, которые присваиваются автоматически при загрузке таблиц:
Код
Dim nName As Name

For Each nName In ActiveWorkbook.Names
    nName.Delete
Next nName

А как удалить подключения?
Изменено: vadi61 - 07.03.2021 15:47:48
 
https://coderoad.ru/45375293
Изменено: Marat Ta - 07.03.2021 17:11:14
 
Цитата
vadi61 написал:
А как удалить подключения?
В #1:
В строке 13
Код
SaveData = False

Добавляем перед строкой 29 (End With):
Код
 .Delete
Владимир
 
ув. sokol92, ув. Marat Ta,спасибо ребята!!
Как все просто, когда знаешь. Мне теперь даже и именованные диапазоны удалять не надо, поскольку в диспетчере имен их нет изначально. Здорово!!

Пока не понял, что делает SaveData = False. Попробовал, вроде не на что не влияет. Диапазоны и подключения убирает . Delete
Страницы: 1
Наверх