Stránka 1 z 1

Excel - VBA - vyskakovací okno

Napsal: 03 lis 2017 14:14
od oximoxi
Zdravím,
potřeboval bych, aby mi excel vyhodil okno s hláškou při splnění podmínky, že buňka na určitém řádku ve sloupci L je vyplněna a současně buňka ve sloupci K na témže řádku je prázdná.Tento skript mi funguje tak jak má, ale pouze na jeden řádek. Jak provedu totéž se všemi řádky v sešitu? Díky.

Sub IsEmptyExample1()

If IsEmpty(Cells(3, 12)) = False Then
If IsEmpty(Cells(3, 11)) = True Then

MsgBox "Doplňte jméno.", vbOKOnly + vbExclamation, "Jméno pracovníka"

End If
End If

End Sub

Re: Excel - VBA - vyskakovací okno

Napsal: 03 lis 2017 15:36
od elninoslov
Nedostatočné informácie. Ako voláte túto procedúru ? Pri akej príležitosti ? Nejakým tlačítkom hromadne ? Pri každej zmene bunky ? Ak pri každej zmene bunky, tak ktorej oblasti sa to má týkať ? Atď...
A treba použiť v IF operátor AND alebo OR (podľa potreby) a nie 2x IF.
Dajte prílohu s lepším vysvetlením.

Re: Excel - VBA - vyskakovací okno

Napsal: 06 lis 2017 10:31
od oximoxi
Při změně buňky ve sloupci L, přičemž by se to mělo týkat řádků 3 až nekonečno.
Jestliže je na X-tém řádku vyplněna buňka ve sloupci L, buňka ve sloupci K nesmí zůstat prázdná, jinak MsgBox...

Re: Excel - VBA - vyskakovací okno

Napsal: 06 lis 2017 13:37
od elninoslov
Tam môže nastať množstvo variantov.
-vyplnené K nevyplnené L
-opačne
-obe vyplnené
-vymazané K ale L ponechané
-opačne
-kopírovanie viacriadkovej oblasti (aj vyplnené aj nevyplnené)
-mazanie viacriadkovej oblasti
-mazanie viacriadkovej nesúvislej oblasti
-... a ich kombinácie
-upozorňovanie na všetky riadky, nie len na jeden

Toto by sa malo vysporiadať asi so všetkým čo ma napadlo, a dosť rýchlo:

Kód: Vybrat vše

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Zmena As Range, ARE As Range, D(), AR As Long, R As Long, RC As Long, Sprava As String

  Set Zmena = Intersect(Target, Columns(12).Resize(Rows.Count - 2).Offset(2))
  If Not Zmena Is Nothing Then
   
    For Each ARE In Zmena.Areas
      With ARE
      AR = .Rows.Count
      RC = .Row - 1
      D = .Offset(0, -1).Resize(AR, 2).Value2
        For R = 1 To AR
          If D(R, 2) <> "" And D(R, 1) = "" Then
          Sprava = Sprava & IIf(Sprava = "", "", vbNewLine) & "v buňce K" & RC + R & " k hodnotě " & D(R, 2)
          End If
        Next R
      End With
    Next ARE
   
    If Sprava <> "" Then MsgBox "Doplňte jméno :" & vbNewLine & Sprava, vbOKOnly + vbExclamation, "Jméno pracovníka"
    Set Zmena = Nothing: Set ARE = Nothing
  End If
End Sub


Aj tak je ale množstvo úskalí.
-čo ak sa vymaže bunka/bunky v K a v L sú pritom dáta ? Žiadne upozornenie nedostanete.
-čo ak sa po upozornení neurobí náprava (zadanie dát) ? ďalší krát už sa nevyplnená bunka v K nebude kontrolovať, pretože je L vyplnené a tým pádom už v L nenastane zmena a nevyvolá sa makro.

Podľa mňa by bolo lepšie to zdupľovať vyfarbením buniek pomocou PF. Alebo použiť iba PF. Tiež ukázané v súbore.

Re: Excel - VBA - vyskakovací okno

Napsal: 07 lis 2017 08:49
od oximoxi
Díky za zaslaný skript :) Samozřejmě více možností nastat může, nicméně vzhledem k plánovanému užití je nepředpokládám.
Tento skript funguje, nicméně potřeboval bych provést ještě jednu drobnou úpravu, se kterou si nevím rady. Do zprávy vyskakovacího okna bych potřeboval uvést nikoliv označení buňky K a hodnotu v buňce L, ale číslo zápisu, které je vždy ve sloupci A na daném řádku. Tedy: "Doplňte jméno pracovníka k zápisu č. [hodnota buňky A]

Re: Excel - VBA - vyskakovací okno

Napsal: 07 lis 2017 09:05
od elninoslov

Kód: Vybrat vše

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Zmena As Range, ARE As Range, D(), A(), AR As Long, R As Long, RC As Long, Sprava As String

  Set Zmena = Intersect(Target, Columns(12).Resize(Rows.Count - 2).Offset(2))
  If Not Zmena Is Nothing Then
   
    For Each ARE In Zmena.Areas
      With ARE
        AR = .Rows.Count
        RC = .Row - 1
        D = .Offset(0, -1).Resize(AR, 2).Value2
        ReDim A(1 To AR, 1 To 1)
        If AR = 1 Then A(1, 1) = .Offset(0, -11).Value2 Else A = .Offset(0, -11).Value2
        For R = 1 To AR
          If D(R, 2) <> "" And D(R, 1) = "" Then
          Sprava = Sprava & IIf(Sprava = "", "", vbNewLine) & "číslo zápisu " & A(R, 1)
          End If
        Next R
      End With
    Next ARE
   
    If Sprava <> "" Then MsgBox "Doplňte jméno pracovníka k zápisu č. :" & vbNewLine & Sprava, vbOKOnly + vbExclamation, "Jméno pracovníka"
    Set Zmena = Nothing: Set ARE = Nothing
  End If
End Sub

Re: Excel - VBA - vyskakovací okno

Napsal: 07 lis 2017 09:08
od oximoxi
Paráda, mnohokrát děkuji. :)