czy majac w excelu zapisane makro jako string odpalic je w excelu?
mam w zmeinnej A cala procedurke powiedzmy makra i jak teraz je odpalic?
no chodzi mi o delhp !!!
chce zapomoca delphi wywolac w excelu makro ktore mam na formie napisane
czy majac w excelu zapisane makro jako string odpalic je w excelu?
mam w zmeinnej A cala procedurke powiedzmy makra i jak teraz je odpalic?
no chodzi mi o delhp !!!
chce zapomoca delphi wywolac w excelu makro ktore mam na formie napisane
Zwracam honor
choć swoją drogą nie rozumiem po co się tak męczyć?
Piszesz dodatek do Excela czy z programu napisanego w Delphi sterujesz Excelem?
W obu przypadkach wygodniej użyć VBA wbudowanego w Excela
ok wiec wyjasnie caly problem ktory neka mnie juz od 20 godzin :(
a wiec chce wczytac do arkusza plik txt, ktory jest tabela typu:
a.txt:
1,ewa,45
2,Bobek,34
3,grafer,87
4,Drober,32
i to potrzebuje by excel wczytal NIE DO JEDNEJ KOLUMNY tlyko wykonał "separacje przecinkami"
jest taka opcja w excelu -dane->dane z pliku txt-> separacja przecinkami
zarejstrowalem takie makro :
With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\a.txt", Destination:=Range("A1"))
.Name = "AIFA"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = xlWindows
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
.Refresh BackgroundQuery:=False
End With
przerobilm teraz to na Delphi:
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).name:='test';
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).FieldNames := True;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).RowNumbers := False;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).FillAdjacentFormulas := False;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).PreserveFormatting := True;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).RefreshOnFileOpen := False;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).RefreshStyle := 1;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).SavePassword := False;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).SaveData := True;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).AdjustColumnWidth := True;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).RefreshPeriod := 0;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFilePromptOnRefresh := False;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFilePlatform := 2;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileStartRow := 1;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileParseType :=1;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileTextQualifier := 1;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileConsecutiveDelimiter := False;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileTabDelimiter := False;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileSemicolonDelimiter := False;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileCommaDelimiter := True;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileSpaceDelimiter := False;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileColumnDataTypes :=VarArrayCreate([1,1,1,1,1,1,1,1,1,1],varVariant);//array(1,1,1,1,1,1,1,1,1,1,1,1,1,1);
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).Refresh;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).BackgroundQuery:=False;
i nie moge przerobic tej linijki z array - psize ze" nieprawidlowy parametr"
powyzsza funkcja bez tej linijki dziala dobrze,ale po to ona jest by własnie rozdzielic na kolumny dane
tu udalo mi sie jeszce innym sposobem wygenerovac amkro
ChDir "C:"
Workbooks.OpenText Filename:="C:\A.txt", Origin:= _
xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False
, Comma:=True, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1),
Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1))
kolega proponuje jeszcze abym wykorzystal VBA.array
ltyko jak teraz ew delphi to zdefinoowac?
Hmm
Zamiast VarArrayCreate() spróbuj użyć VarArrayOf()
ex.QueryTables.Add('text;C:\gielda\bazanotowan\AIFA.txt',ex.range['A3','G500']).TextFileColumnDataTypes :=VarArrayOf([1,1,1,1,1,1,1,1,1]);
juz nie powoduje bladu, ale jest we nednej linijce
jak zrobic ta tablice na wiecej wymiarow
zeby byla taka sama jak array(1,1,1,1,1,1)
Gdyby text był rodzielany średnikiem i miał wiersz nagłówkowy
to polecem sterownik ODBC:
With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
"ODBC;DBQ=C:_A;DefaultDir=C:_A;Driver={Microsoft Text Driver (*.txt; *.csv)};DriverId=27;FIL=text;MaxBufferSize=2048;MaxScanRows=8;" _
), Array( _
"PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;")), _
Destination:=Range("A1"))
.CommandText = Array("SELECT *" & Chr(13) & "" & Chr(10) & "FROM b.txt b")
.Name = "Kwerenda z text"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
Gdyby text był rodzielany średnikiem i miał wiersz nagłówkowy
to polecem sterownik ODBC:
With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
"ODBC;DBQ=C:_A;DefaultDir=C:_A;Driver={Microsoft Text Driver (*.txt; *.csv)};DriverId=27;FIL=text;MaxBufferSize=2048;MaxScanRows=8;" _
), Array( _
"PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;")), _
Destination:=Range("A1"))
.CommandText = Array("SELECT *" & Chr(13) & "" & Chr(10) & "FROM b.txt b")
.Name = "Kwerenda z text"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
Gdyby text był rodzielany średnikiem i miał wiersz nagłówkowy
to polecem sterownik ODBC:
With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
"ODBC;DBQ=C:\_A;DefaultDir=C:\_A;Driver={Microsoft Text Driver (*.txt; *.csv)};DriverId=27;FIL=text;MaxBufferSize=2048;MaxScanRows=8;" _
), Array( _
"PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;")), _
Destination:=Range("A1"))
.CommandText = Array("SELECT *" & Chr(13) & "" & Chr(10) & "FROM b.txt b")
.Name = "Kwerenda z text"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
:|
Sorki coś mi się przeglądarka zacięła
ale tu jest wykorzystane array()
i ltyko z tym jest problem
vararrayof - nie powoduje bladu ltyko ze nadal jest w jednej kolumnie
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileColumnDataTypes :=VarArrayOf([1,1,1,1,1,1,1]);
:|
Sorki coś mi się przeglądarka zacięła
To zamiast pisać jeszcze czwartego posta z przeprosinami, to może dwa z tamtych poprzednich byś wyciął? (Edycja postu -> Kasuj)
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).name:='test';
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).FieldNames := True;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).RowNumbers := False;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).FillAdjacentFormulas := False;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).PreserveFormatting := True;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).RefreshOnFileOpen := False;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).RefreshStyle := 1;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).SavePassword := False;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).SaveData := True;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).AdjustColumnWidth := True;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).RefreshPeriod := 0;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFilePromptOnRefresh := true;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFilePlatform := 2;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileStartRow := 2;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileParseType :=1;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileTextQualifier := 1;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileConsecutiveDelimiter := true;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileTabDelimiter := true;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileSemicolonDelimiter := true;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileCommaDelimiter := True;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileSpaceDelimiter := true;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).TextFileColumnDataTypes :=VarArrayOf([1,1,1,1,1,1,1]);
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).Refresh;
ex.QueryTables.Add('text;C:\A.txt',ex.range['A3','G500']).BackgroundQuery:=False;
czy nie powinienem jakos zrobic tak jak w excelu z with? albo ex.range moze byczle - ale jak robie tak jak pisze range('A1') to delphi nie rozpoznaje metody....
mzoe da sie wykorzystac do tego kontrolke TexcelXP?
Adam.Pilorz
To zamiast pisać jeszcze czwartego posta z przeprosinami, to może dwa z tamtych poprzednich byś wyciął? (Edycja postu -> Kasuj)
Problem w tym, że strona w mojej przeglądarce nie reaguje na przycisk
Usuń post
Niestety nie mam w pracy Delphi aby móc zerknąć i ci coś pomóc.
Osobiście to importując plik tekstowy do Excela zwykle piszę procedurę czytającą plik tekstowy linia po lini. Mam wtedy pełną kontrolę nad tym co się z pliku czyta i gdzie to w arkuszu umieścić.
tak jak juz pisalem ta metoda jest zbyt wolna - i msuze to zrobic z separacja przecinkami - opentext
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = 1
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = True
.TextFilePlatform = 2
.TextFileStartRow = 1
.TextFileParseType = 1
.TextFileTextQualifier = 1
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.Refresh BackgroundQuery:=False
Taki kod w Excelu chodzi poprawnie (wstawia w osobne kolumny)
Zauważyłem, że ustawiasz na TRUE wszystkie separatory a potrzebujesz tylko TextFileCommaDelimiter, ustawiasz również odświeżanie w tle po wywołaniu metody Refresh, choć to wszystko nie powinno mieć wpływu na to, że wrzuca Ci całość do jednej kolumny</quote>