< návrat zpět

MS Excel


Téma: VBA - vytvorenie TXT súboru rss

Zaslal/a 25.9.2015 19:47

Dobrý deň,

chcel by som Vás poprosiť o radu/riešenie. Moje programovacie schopnosti sú veľmi na nízkej úrovni. Ak by niekto mal čas a chuť pomôcť veľmi pekne Vám ďakujem.Trápim sa s tým už/ešte len 4 hodiny výsledok nikde :/

príloha:
Excel file: http://uloz.to/x7YqYiYX/dashboard-2-xlsm
TXT file: http://uloz.to/xy9Wx5xF/commandfile-txt

Potreboval by som pomôcť s VBAčkom. Ako by VBA malo pracovať:

- podmienka: Ak bunka "A2=3" tak:

- exportuj obsah "C2:N2" do TXT súboru (TXT súbor by mal vyzerať ako uviedol v prílohe), dôležité sú tie čiarky "," v TXT súbore čo oddelujú jednotlivé bunky v Exceli

- exportuj daný TXT súbor do C:\txtfiles\

ďakujem, ak sa niekto do toho pustí 1

prajem pekný večer

jojofx

Zaslat odpověď >

Strana:  1 2   další »
#027077
elninoslov
Neskúmal som Váš ostatný kód, ani celý zošit. Doplnil som Vám len do List1 makro, ktoré urobí to čo chcete.
http://uloz.to/x4cmpuZa/dashboard-2-xlsmcitovat
#027078
avatar
Můj pokus ;-)...
P.

Př.:Private Sub Worksheet_Change(ByVal Target As Range)
Dim cesta_k_souboru As String
Dim nazev_souboru As String
Dim sloupec As Byte
Dim ws As Worksheet
Dim text_k_zapisu As String

If ActiveSheet.Range("A2").Value = 3 Then
Set ws = ActiveWorkbook.ActiveSheet
cesta_k_souboru = "C:\txtfiles\"
nazev_souboru = "commandfile" & ".txt"
text_k_zapisu = ""

For sloupec = 3 To 14
text_k_zapisu = text_k_zapisu & Replace(ActiveSheet.Cells(2, sloupec).Value, ",", ".", 1)
If sloupec <> 14 Then
text_k_zapisu = text_k_zapisu & ","
End If
Next sloupec

Open cesta_k_souboru & nazev_souboru For Output As #1
Print #1, text_k_zapisu
Close #1
End If

End Sub
citovat
#027079
avatar
ďakujem Vám páni

oba fungujú správne ale Pavlus-ov kód pracuje lepšie pretože, v tej podmienke (A1=3) môžem použiť vzorec- moje porozumenie, ako keby to bolo active a to je to čo potrebujem(práca s real time dátami)

ďakujem Vám obom ešte raz 1

prajem pekný večer

jojofxcitovat
#027080
elninoslov
Podľa mňa kódy sa líšia iba v "spájaní" do stringu (Join vs. For). Ostatné je rovnaké. Testovanie hodnoty cez Cell a Range je to isté. Ak by Vám tie RealTime data náhodou nevyvolali Worksheet_Change metódu, tak skúste použiť Calculate metódu.citovat
#027082
avatar
hmmm... nejako to nechce reagovať, keď dáta sa aktualizujú. Vlastne logika tej "3" je, že sú splnené tri podmienky (sum troch podmienok, ak keď sú všetky tri podmienky splnené tak by to malo vytvoriť TXT súbor)

tu je trochu upravený kód a neviem čo ďalej... ak by niekto mal nejaké riešenie bolo by to super

skúšal som zmeniť z change na calculate a vyhodilo mi to hneď nejaké kompilačné errory a ďalej som sa už nevedel pohnúť

Private Sub Worksheet_Change(ByVal Target As Range)

Dim cesta_k_souboru As String

Dim nazev_souboru As String

Dim sloupec As Byte

Dim ws As Worksheet

Dim text_k_zapisu As String

If ActiveSheet.Range("G4").Value = 3 Then

Set ws = ActiveWorkbook.ActiveSheet

cesta_k_souboru = "C:\Users\masof_000\AppData\Roaming\MetaQuotes\Terminal\1DAFD9A7C67DC84FE37EAA1FC1E5CF75\MQL4\Files\tradefromcsvfile\"

nazev_souboru = "commandfile" & ".txt"

text_k_zapisu = ""



For sloupec = 11 To 22

text_k_zapisu = text_k_zapisu & Replace(ActiveSheet.Cells(30, sloupec).Value, ",", ".", 1)

If sloupec <> 22 Then

text_k_zapisu = text_k_zapisu & ","

End If

Next sloupec







Open cesta_k_souboru & nazev_souboru For Output As #1

Print #1, text_k_zapisu

Close #1

End If

If ActiveSheet.Range("G5").Value = -3 Then

Set ws = ActiveWorkbook.ActiveSheet

cesta_k_souboru = "C:\Users\masof_000\AppData\Roaming\MetaQuotes\Terminal\1DAFD9A7C67DC84FE37EAA1FC1E5CF75\MQL4\Files\tradefromcsvfile\"

nazev_souboru = "commandfile" & ".txt"

text_k_zapisu = ""



For sloupec = 12 To 23

text_k_zapisu = text_k_zapisu & Replace(ActiveSheet.Cells(31, sloupec).Value, ",", ".", 1)

If sloupec <> 23 Then

text_k_zapisu = text_k_zapisu & ","

End If

Next sloupec







Open cesta_k_souboru & nazev_souboru For Output As #1

Print #1, text_k_zapisu

Close #1

End If

End Subcitovat
#027083
elninoslov
Vidím tam veľké množstvo problémov a nejasností.
-Popis úplne iný, Váš kód úplne iný
-Ktorý list bude ActiveSheet keď sa má daná operácia vykonať? V tomto prípade bude lepšie odkazovať na meno listu, nie na ActiveSheet.
-Čo ak nastane v G4=3 v G5=-3 ? O tom, že G4 bola "3" a vytvoril sa súbor nebudete vedieť, lebo ho prepíšu data z iného riadku počas spracovania "-3".
-Set ws = ActiveWorkbook.ActiveSheet, je úplne zbytočný, keď sa aj tak ďalej odkazujete na ActiveSheet a nie na ten ws.
-Recalc() berie z ktorého listu data na kopírovanie ? Nesmiete to odkazovať v procedúre z Modulu iba cez Range. Už dupľom nie, ak je volaná cez časovač, čiže neviete na ktorom liste budete prekliknutý.
-Ak to hodíte do Calculate, tak dostanete chybu práve na tom spomínanom ActiveSheet. Predpoklad je taký, že tú Calculate vyvolá vzorec, ktorý je v G4 a G5 na liste "List1", odkiaľ sa majú aj brať data na uloženie (???). Keď to zmením na Calculate a ActiveSheet zmením na Sheets("List1") tak to fachá.

Proste veľa vecí, ktoré musíte upresniť.citovat
#027084
avatar
okey ideme to upresniť nieje problém :)
príloha pre vizualizáciu: http://uloz.to/xhTax2X8/db-alerts-auto-xlsm

Popis úplne iný, Váš kód úplne iný
nechcel som Vás zaťažovať ostatnými vecami, myslel som,že to spravím aj sám ale nie som schopný :(


-Ktorý list bude ActiveSheet keď sa má daná operácia vykonať? V tomto prípade bude lepšie odkazovať na meno listu, nie na ActiveSheet.

-myslím si, že tu môže byť chyba. Keď sa pozriete do súboru, tak je to rozdelené. Aktívny(otvorený) spreadsheet bude vždy "sheet1" lebo sheet1 je kontrólny sheet

-Čo ak nastane v G4=3 v G5=-3 ? O tom, že G4 bola "3" a vytvoril sa súbor nebudete vedieť, lebo ho prepíšu data z iného riadku počas spracovania "-3".
-to je nemožné, tie podmienky sú tak spravené,že môže byť iba +3 alebo -3

-Set ws = ActiveWorkbook.ActiveSheet, je úplne zbytočný, keď sa aj tak ďalej odkazujete na ActiveSheet a nie na ten ws.

-tu neviem čo okomentovať

-Recalc() berie z ktorého listu data na kopírovanie ?
tento kód som si robil sám podľa internetu a takto to aj vyzerá, ťažkopádny kód a manipulácia ešte tažšia
ten recalc funguje na aktívnom spreadsheete

skúste sa na to pozrieť :)citovat
#027085
avatar
to Jojofx:
Domnívám se, že vidím přesně ten typ dialogu, který není dobré vést. Pokud je dotaz na začátku neurčitý a tazatel v průběhu dialogu mění zadání, odpovídá se velmi špatně. Stojí to moře času a nakonec stejně platí něco úplně jiného než na začátku. Dodatečné doplňování opomenutých podmínek řešení patří do okruhu špatně rozmyšlených dotazů. Často stačí, abych se donutil svůj dotaz dostatečně precizovat, a na polovinu otázek si při tom odpovím sám. Otázka by měla být pokud možno přesná a v případě složitějších dat by měla být doložena příkladem. Pak i odpověď bude zpravidla jasná a konkrétní.citovat
#027086
elninoslov
Ešte poprosím nejaké upresnenie:

-Takže každých 30 minút "tikne" Timer, prebehne procedúra Recalc, ktorá skopíruje Realtime data z počítaného stĺpca F25:F52 do G25:G52, pre ďalšie spracovanie. To má vyvolať udalosť (či už Worksheet_Change alebo Worksheet_Calculate) a v v nej sa má skontrolovať či v liste je hodnota 3 v G4 alebo -3 v G5. V ktorom liste ? Vo všetkých listoch okrem "sheet1" a "Indices" ? Takto to mám teraz urobené cez Calculate (stačí jedno, netreba pre každý list zvlášť).

-Ak vo všetkých, tak vidím ďalší problém v tom, že ak bude v G4=3 na liste "AUDCAD", tak sa uloží TXT, ak bude ale G4=3 aj na inom liste napr. "AUDCHF", opäť sa uloží TXT,a predošlý záznam z "AUDCAD" prepíše. Takže bude lepšie buď pre každý list mať vlastný TXT súbor, alebo jeden TXT súbor, do ktorého sa budú pridávať riadky (s identifikátorom listu, ktorý záznam vyvolal).

-A ešte sa vrátim k vyvolanej udalosti. Nevieme akým spôsobom tá Vaša aplikácia vkladá tie aktualizované údaje do Excelu, ale ak pri tom vypína EnableEvents, tak to nevyvolá Worksheet_Change udalosť. Udalosť Worksheets_Calculate by to ale po dokončení tak či tak vyvolať malo. A tu vidím ďalší zádrhel. Neviem ako často sa Vám tie "RealTime" dáta vkladajú, ale v takomto prípade po každom aktualizovaní vyvolajú Calculate, čiže aj prípadný zápis do TXT. Ak chcete ale prípadný zápis do TXT realizovať práve až v 30 min intervaloch, potom by bolo vhodnejšie volať kontrolu a zápis priamo v Recalc.

-Navyše, ak bola pri minulej kontrole v G4 3, a pri ďalšej tiež 3 (čiže sa hodnota nezmenila) tak sa mi Calculate nespustí. Takže by som to opäť riešil poslednou vetou predošlého bodu.

Rozpracovaný súbor.
http://uloz.to/x9p2n6xY/db-alerts-auto-rarcitovat
#027087
avatar
áno priznávam, moja chyba, že som menil podmienky počas dialógu ale zase na druhej strane, keď porovnáme upravený kód a kód, ktorý mi bol poskytnutý tak zmeny môžme vidieť iba v : zmene adresára(cesta kde má TXT file byť uložený) a druhá podmienka s "-3"

ono to všetko funguje ako má, len problém je, že to funguje iba keď manuálne zadám hodnoty a stlačím enter a nefunguje to "samovoľne" .

Spravil som si test: menil som hodnoty(aby v "G4" bola "3" v AUDCAD sheete) manuálne v "sheet1" všetky dáta sú ťahané zo "sheet1" a nevytvorilo to TXT súbor.

ale keď som menil hodnoty manuálne v napr. AUDCAD dostal som v "G4" "3" tak txt súbor bol vytvorenýcitovat

Strana:  1 2   další »

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje