makro excel

0

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

0

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

0

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"

0

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?

0

Hmm
Zamiast VarArrayCreate() spróbuj użyć VarArrayOf()

0

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)

0

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

0

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

0

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
0

:|
Sorki coś mi się przeglądarka zacięła

0

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]);

0

:|
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)

0

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....

0

mzoe da sie wykorzystac do tego kontrolke TexcelXP?

0

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

0

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ć.

0

tak jak juz pisalem ta metoda jest zbyt wolna - i msuze to zrobic z separacja przecinkami - opentext

0
        .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>

1 użytkowników online, w tym zalogowanych: 0, gości: 1