< návrat zpět

MS Excel


Téma: jak zaznamenat vybrané hodnoty na jiný list rss

Zaslal/a 29.6.2014 22:44

Ahoj potřebovala bych vyřešit jeden problém. Mám Dva listy a na jeden zapisuji data a potřebuji, aby se mi na druhý list automaticky zaznamenala data, pokud bude nalezena určitá hodnota v jednom ze dvou sloupců na prvním listu. Zápis hodnost na list číslo 2 by měl probíhat vždy na první prázdný řádek odshora počínaje řádkem 10. Ráda bych to vyřešila VBA makrem, které budu spouštět přes tlačítko poté co vyplním list, ale už nad tím dumám týden a nic mě nenapadá. Navíc bych potřebovala, aby pokud dojde ke smazání některých hodnot v listu 1, tak aby se odpovídající řádky odstranily i v listu 2. Nejlépe asi odstraněním celého řádku.

Všem moc díky za nápady přikládám i ilustrační soubor. Budu ráda pokud mi s tím někdo pomůže alespoň částečně , třeba mě to nakopne a dodělám to. Všem moc díky za ochotu.http://www.edisk.cz/stahni/54026/automaticky_prepis.xls_35.5KB.html

Zaslat odpověď >

#020236
avatar
nebude vam stacit Pivot Tabulka vytvorena s pomocnym stlpcom???
Příloha: zip20236_automaticky_prepis.zip (13kB, staženo 45x)
citovat
#020239
avatar

Palooo napsal/a:

nebude vam stacit Pivot Tabulka vytvorena s pomocnym stlpcom???Příloha: 20236_automaticky_prepis.zip

Takto ne potřebuji to přes vba protože na to budou navázány další úkony. A potřebuji zapisovat jen ty hodnoty, které jsem uvedla. A měly by být seřazeny podle data. Ale děkuji za snahu.citovat
icon #020240
avatar
Nasledujúci kód si daj pod tlačítko. Budeš musieť spúšťať pri zmene na liste Leden (po tom, čo vyplníš list, alebo ho nejako zmeníš), kód vytvorí zoznam na liste ZAZNAM vždy celý odznovu (farbičky som neriešil):Option Explicit

Sub Generuj()
Dim myRng As Range, myArray() As Variant, i As Integer, datum As Date

Set myRng = Sheets("ZAZNAM").[A9].CurrentRegion

With myRng
If .Rows.Count > 1 Then
Set myRng = .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count)
myRng.ClearContents
End If
End With

With Sheets("LEDEN")
Set myRng = .[A2]
Do While myRng <> ""
With myRng
If .Offset(0, 4) = "U" Then
ReDim Preserve myArray(3, i)
myArray(0, i) = .Value
myArray(1, i) = .Offset(0, 4)
myArray(2, i) = Format(.Offset(0, 1), "h:mm")
myArray(3, i) = Format(.Offset(0, 2), "h:mm")
i = i + 1
End If

If .Offset(0, 3) = "C" Then
If .Offset(-1, 3) <> "C" Then
ReDim Preserve myArray(3, i)
myArray(0, i) = .Value
datum = .Value
myArray(1, i) = .Offset(0, 3)
myArray(2, i) = Format(.Offset(0, 1), "h:mm")
myArray(3, i) = Format(.Offset(0, 2), "h:mm")
i = i + 1
Else:
myArray(0, i - 1) = datum & "-" & myRng
myArray(3, i - 1) = Format(.Offset(0, 2), "h:mm")
End If
End If
Set myRng = .Offset(1, 0)
End With
Loop
End With

Sheets("ZAZNAM").[A10].Resize(UBound(myArray, 2) + 1, UBound(myArray, 1) + 1) = WorksheetFunction.Transpose(myArray)
Set myRng = Nothing
Erase myArray
End Sub
citovat
#020242
avatar
AL si machr smekám klobouk a strašně moc děkuji. Tohle jsem přesně potřebovala. Barvičky byly jen pro lepší orientaci. Moooooc díky.citovat
icon #020243
avatar
Prípadne do okna ThisWorkbook vlož ešte:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Sh.Name = "ZAZNAM" Then Call Generuj
End Sub
Po kliknutí do (aktivovaní) listu ZAZNAM sa makro spustí automaticky a nemusíš klikať na žiadne tlačítko.citovat
#020294
avatar
Všimla jsem si ještě, že zapsaná data do tabulky záznam smažou vše co přiléhá k nově vytvořené oblasti a pokud není na listu leden ani jeden znkak, který se má přepsat do záznamu, skončí spuštění makra chybou.
Šlo by to ještě upravit tak, že pokud bych měla více listů leden, únor, březen atd.. Tak aby po spuštění makra z ledna byly zapsány jeho hodnoty a po spuštění z února se hodnoty zapdaly pod ty lednové atd. A pokud bych potřebovala v červnu udělat změny ledna tak aby to přemazalo jen leden.
Zkusila bych to sama ale nějak nemůžu přijít na to co má vliv na mazání okolních buněk a také nerozumím poslední části kódu od Sheets("Zaznam").[A10]... A taky tomu proč te tam Loop co to dělá?
Díky za info.citovat
icon #020303
avatar
Všimla jsem si ještě, že zapsaná data do tabulky záznam smažou vše co přiléhá k nově vytvořené oblasti - písal som, makro vždy vytvorí celý zoznam znovu, pred jeho vytvorením zmaže pôvodne vytvorený, to sa deje v časti Set myRng = Sheets("ZAZNAM").[A9].CurrentRegion

With myRng
If .Rows.Count > 1 Then
Set myRng = .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count)
myRng.ClearContents
End If
End With
a pokud není na listu leden ani jeden znkak, který se má přepsat do záznamu, skončí spuštění makra chybou. Je možné ošetriť, miestoSheets("ZAZNAM").[A10].Resize(UBound(myArray, 2) + 1, UBound(myArray, 1) + 1) = WorksheetFunction.Transpose(myArray)napísať: Select Case Not myArray
Case -1:
Case Else: Sheets("ZAZNAM").[A10].Resize(UBound(myArray, 2) + 1, UBound(myArray, 1) + 1) = WorksheetFunction.Transpose(myArray)
End Select
Šlo by to ještě upravit tak, že pokud bych měla více listů leden, únor, březen atd.. Tak, ako to je napísané, to pre daný prípad fungovať nebude, muselo by sa to prepísať. Bez nároku na odmenu ale riešim iba záležitosti, ktoré mi nezaberú viac, než hodinu času, takže doporučím vhodnejší prístup, ktorý nebude znamenať dramatickú úpravu makra, ktorú by si mohla zvládnuť, sama (písala si, že stačí nakopnúť, nie že to má niekto tvoriť celé za Teba). K zmienenej úprave: Nedoporučujem vytvárať samostatný list pre každý mesiac zvlášť. Miesto toho, zapisuj dáta za všetky mesiace do jednoho listu pod seba, akurát pridaj stĺpec s názvom mesiaca, ktorého sa záznam týka. Na liste výstup si tiež pridaj jeden stĺpec pre názov mesiaca. Prvý rozmer poľa myArray zvýš o jedna, t.j. miesto ReDim Preserve myArray(3, i) do kódu napíš ReDim Preserve myArray(4, i) kde do myArray(4, i) načítaj príslušnú bunku s názvom mesiaca. Podmienku v časti If .Offset(0, 3) = "C" Then
If .Offset(-1, 3) <> "C" Then
budeš musieť ešte rozšíriť o test, či riadok X a riadok X-1 sa týka rovnakého mesiaca. Kód bude naďalej generovať vždy celý zoznam odznova za všetky mesiace.
a také nerozumím poslední části kódu od Sheets("Zaznam").[A10] - to je práve problém, že nerozumieš. Vtip je totiž v tom, že záznamy sú prvotne z Listu LEDEN ukladané v cykle do poľa myArray a až potom, čo je pole naplnené, tak je jeho obsah vložený do oblasti buniek, ktorá musí byť rovnakého rozsahu (rozmeru) ako uvedené pole. Ten rozsah buniek, kam sa má obsah poľa preniesť, sa deje práve cez inštrukciu:Sheets("ZAZNAM").[A10].Resize(UBound(myArray, 2) + 1, UBound(myArray, 1) + 1)
A taky tomu proč te tam Loop co to dělá? Ukončuje cyklus (vracia na jeho začiatok); začiatok cyklu je v tomto prípade slovo Do [While].
Nebolo mojim úmyslom v tomto príspevku motať Ti hlavu, ale je mi jasné, že chaos v tom mať budeš. Chce to študovať. Mňa zmiatla Tvoja poznámka úvodom:Ráda bych to vyřešila VBA makrem, které budu spouštět přes tlačítko poté co vyplním list, ale už nad tím dumám týden a nic mě nenapadá. Mal som za to, že VBA trochu ovládaš, ale pokiaľ nevieš, čo znamená Loop tak je pred Tebou ešte dlhá cesta 1citovat

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