Příspěvky uživatele


< návrat zpět

Strana:  1 ... « předchozí  138 139 140 141 142 143 144 145 146   další » ... 286

Neprejde to ani keď prvý riadok vynecháte?

Upravené, zabudol som pridávať nové položky aj do poľa všetkých hodnôt, ktorá sa používa na načítanie do všetkých zoznamov, ale aj na získanie hodnoty pri kliku v menu. Pole som musel preto otočiť... to je nepodstatné.

Kontrola služobnej cesty prebieha na riadku 37 v procedúre Workbook_SheetChange modulu Tento_zošit.

Je to zamotané a zložité, a navyše je po mne cudziemu človeku niekedy ťažko skúmať, čo som ako a prečo tak či onak myslel. No skúste, či Vám tie kódy niečo povedia.

Vzorcom skúste takto.

Sub Aktualizuj()
Dim V(), O(), x As Byte, y As Byte

ReDim V(1 To 3, 1 To 7): ReDim O(1 To 3, 1 To 7)
V = List3.Cells(21, 2).Resize(3, 7).Value
O = List3.Cells(24, 2).Resize(3, 7).Value
Application.ScreenUpdating = False

For y = 1 To 3
For x = 1 To 7
If V(y, x) <> O(y, x) Then Call SizeCircle(List1.Shapes("Ovál " & 42 + x + ((y - 1) * 7)), V(y, x))
Next x
Next y

List3.Cells(24, 2).Resize(3, 7).Value = V
Application.ScreenUpdating = True
End Sub

Ja by som to nerobil ako reakciu na prepočet buniek, ale ako reakciu na zmenu toho, čo prepočet spôsobuje. A to je zmena D3 alebo F3 alebo zmena vstupných dát. D3 a F3 odchytajte cez
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("D3,F3"), Target) Is Nothing Then Aktualizuj
End Sub

a prípadnú zmenu zdrojových údajov predsa musíte robiť keď ste na tom liste samsung-svc-report. Teda odchyťte odchod z tohto listu pri ktorom sa zavolá prekreslenie Shapes
Private Sub Worksheet_Deactivate()
Aktualizuj
End Sub

Ďalej neprekresľujte tie, ktoré sa nezmenili. Na to je tam uchovanie starých hodnôt. Môžete použiť buď moju SizeCircle alebo Vašu SizeCircle2 (len som upravil xCircle na objekt).
Sub SizeCircle(ByRef xCircle As Shape, Diameter)
Dim PozW As Single, PozH As Single, PolD As Single

Diameter = IIf(Diameter > 100, 10, IIf(Diameter < 1, 1, Diameter))
PolD = Diameter / 2
With xCircle
PozW = .Left + .Width / 2
PozH = .Top + .Height / 2
.Width = Diameter
.Height = Diameter
.Left = PozW - PolD
.Top = PozH - PolD
End With
End Sub

alebo
Sub SizeCircle2(ByRef xCircle As Shape, Diameter)
Dim xCenterX As Single
Dim xCenterY As Single
Dim xDiameter As Single

On Error GoTo ExitSub
xDiameter = Diameter
If xDiameter > 100 Then xDiameter = 100
If xDiameter < 1 Then xDiameter = 1

With xCircle
xCenterX = .Left + (.Width / 2)
xCenterY = .Top + (.Height / 2)
.Width = xDiameter
.Height = xDiameter
.Left = xCenterX - (.Width / 2)
.Top = xCenterY - (.Height / 2)
End With
ExitSub:
End Sub

Ak ale chcete, tak to kľudne zavolajte aj cez Worksheet_Calculate listu Calculations, len pri prípadnej zmene zdroju, to bude prekresľovať pri zmene každej oblasti. V tom prípade ale vymažte Worksheet_Change z listu Overview a Worksheet_Deactivate z listu samsung-svc-report.

Private Sub Worksheet_Calculate()
Aktualizuj
End Sub

Funguje to na obidva spôsoby. Ešte som Vám upravil vzorce v Calculations:
A11 - "rrrr" pozná iba CZ Excel, ostatné nie
B21:H23 - Pridal som IFFERROR, lebo pri zmene dátumov na rovnaký 1.9.2018 prichádza k deleniu nulou.

A ešte som zmenil číslovanie Shapes zo 42-48 na 43-49, aby išli všetky po sebe (lebo ďalšie boli od 50...) a dal sa ľahko v cykle vypočítať názov. Inak by tam musela byť zbytočná podmienka.

Celé riešenie v prílohe na GoogleDrive.

"Iba jedna vec" - zdá sa Vám to stále iba "iba" ?
Je to podstatne zložitejšie.

Šmarjá, čo je to zas za požiadavku bez prílohy ? Príklad (potrebujete uchovávať staré hodnoty), kde je to volané podľa zmeny A2:A3. Dá sa to ale urobiť aj na metódu Calculate, ale takto to bude asi lepšie.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim V(), O(), x As Byte

If Not Intersect(Cells(2, 1).Resize(2), Target) Is Nothing Then
ReDim V(1 To 1, 1 To 7): ReDim O(1 To 1, 1 To 7)
V = Cells(2, 27).Resize(1, 7).Value
O = Cells(1, 27).Resize(1, 7).Value
Application.ScreenUpdating = False

For x = 1 To 7
If V(1, x) <> O(1, x) Then Call SizeCircle(Shapes("Ovál " & 41 + x), V(1, x))
Next x

Application.EnableEvents = False
Cells(1, 27).Resize(, 7).Value = V
Application.EnableEvents = True
Application.ScreenUpdating = True
End If
End Sub


Sub SizeCircle(ByRef xCircle As Shape, Diameter)
Dim PozW As Single, PozH As Single, PolD As Single

Diameter = IIf(Diameter > 100, 10, IIf(Diameter < 1, 1, Diameter))
With xCircle
PozW = .Left + .Width / 2
PozH = .Top + .Height / 2
PolD = Diameter / 2
.Width = Diameter
.Height = Diameter
.Left = PozW - PolD
.Top = PozH - PolD
End With
End Sub

Pridajte tam
DoEvents
pred
Loop
ale pozor, prírastok dajte aspoň 10. Určite nie po 1, to budú skôr Vianoce kým to prejde po 1.

Pravé tlačítko a vlastné PopUp Menu ?

Skúste jednu z týchto 2 metód

Jednoduchá tabuľka. Teda ak som to pochopil správne...

To je predsa logické, že Vám tam dá znovu oddeľovače. Veď predsa použijete stále rovnaký polyfunkčný exportovací systém.

Použite tú druhú metódu, čo som postol, potom čo urobíte požadované úpravy v dátach (možno aj tie by sa dali zautomatizovať makrom). Žiaľ nevieme aké typy dát sú v stĺpcoch, koľko ich je, a aký požadovaný formát majú mať napr. dátumy či desatinné čísla. Toto si ošetríte pre požadované polia v tom cykle x napr cez Select Case x.

Dostanete z toho požadované CSV UTF-8 BOM, bez nadbytočných oddeľovačov s prvom riadku.

Toho BOM sa ľahúčko zbavíte v NotePad++ asi za 4 sekundy (menu Kódovanie - Kódovať v UTF-8 bez BOM - Uložiť).

Ak to robíte často, makro si môžete dať ako doplnok do lišty v Exceli, len teda otvoríte CSV, urobíte úpravy (alebo ak budú automatizovateľné makrom, tak ručne nemusíte), stlačíte čudlík a vytvorí sa nový CSV, ktorý sa môže už rovno v NotePad++ otvoriť a len čaká na Vaše 3 kliky.

Kým sa nepríde na lepší systém priamo v Exceli, myslím, že by to bolo prijateľné.

Neviem, či je možné rovno v Exporte Excelu urobiť rozdielny počet stĺpcov, no tu sú dva príklady:
Sub ExportCSV()
Dim F As Object, Prvy As Integer, Ostatne As Integer, Riadkov As Long, i As Long, x As Integer, rngUsed As Range, D(), S As String
Const DEL = ";"

With ActiveSheet
Prvy = .Cells(1, .Columns.Count).End(xlToLeft).Column
Set rngUsed = .UsedRange
Ostatne = Intersect(rngUsed, rngUsed.Offset(1, 0)).Columns.Count
With rngUsed
Riadkov = .Rows.Count
ReDim D(1 To Riadkov, 1 To .Columns.Count)
D = .Value
End With
End With

Set F = CreateObject("Scripting.FileSystemObject").CreateTextFile("D:\CSVExport.csv", True, True)
For i = 1 To Riadkov
S = vbNullString
For x = 1 To IIf(i = 1, Prvy, Ostatne)
S = S & IIf(S = vbNullString, vbNullString, DEL) & D(i, x)
Next x
F.Writeline S
Next i

Set F = Nothing: Set rngUsed = Nothing
End Sub


Sub ExportCSV2()
Dim Prvy As Integer, Ostatne As Integer, Riadkov As Long, i As Long, x As Integer, rngUsed As Range, D(), S As String, Pole() As String
Const DEL = ";"

With ActiveSheet
Prvy = .Cells(1, .Columns.Count).End(xlToLeft).Column
Set rngUsed = .UsedRange
Ostatne = Intersect(rngUsed, rngUsed.Offset(1, 0)).Columns.Count
With rngUsed
Riadkov = .Rows.Count
ReDim D(1 To Riadkov, 1 To .Columns.Count)
D = .Value
End With
End With

ReDim Pole(Riadkov - 1)
For i = 1 To Riadkov
S = vbNullString
For x = 1 To IIf(i = 1, Prvy, Ostatne)
S = S & IIf(S = vbNullString, vbNullString, DEL) & D(i, x)
Next x
Pole(i - 1) = S
Next i

With CreateObject("ADODB.Stream")
.Open
.Charset = "UTF-8"
.WriteText Join(Pole, vbCrLf)
.SaveToFile "D:\CSVExport.csv", 2
.Close
End With

Set rngUsed = Nothing
End Sub


Má to ale jedno podstatné ALE. Už X-krát omieľané kódovanie UTF-8 v CSV a BOM. Prvý kód neurobí UTF-8 ale nejaké "UCS-2 LE BOM". Druhý kód urobí "UTF-8 BOM". To BOM sú 3 bajty v súbore, ktoré robia šarapatu pri importoch do rôznych systémov. Vyskúšajte, alebo sa inšpirujte pri hľadaní iného riešenia.

Možno klasickým exportom urobiť CSV, to v makre otvoriť ako text, zmazať v prvom riadku všetky ";" sprava po najbližší znak a súbor znovu uložiť. Ale zase to ALE, lebo ak by sa Vám aj podaril Export do UTF-8 bez BOM, tak takéto uloženie to opäť degraduje.

Možno má niekto niečo použiteľnejšie.

Všetkým bunkám nastavte vo Formátovať bunky - Ochrana - Zamknúť bunky. Na tom istom mieste zrušte zaškrtávatko pre bunky určené na zmenu. Pre tieto bunky potom ešte nastavte podmienené formátovanie. V menu Revízia - Zabezpečiť hárok - nastavte heslo a položky (môžete ich asi nechať bez zmeny). Uložte.
Excel ale nieje trezor, a hlavne staré XLS sa dá ľahko prelomiť. Najnovší XLSX v nových Office už také ľahké prelomenie nedovoľuje.

Príkladov je mnoho...

Private Sub CommandButton1_Click()
Dim Pole() As String
If Len(TextBox1.Text) > 0 Then
Pole = Split(TextBox1.Text, vbCrLf)
ActiveSheet.Cells(1, 1).Resize(UBound(Pole) + 1, 1).Value = WorksheetFunction.Transpose(Pole)
End If
End Sub


Strana:  1 ... « předchozí  138 139 140 141 142 143 144 145 146   další » ... 286

Uživatelské menu

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

Menu

On-line nástroje

Formulář Faktura

Formulář Faktura IV

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

Aktivní diskuse