Un (1) caracter/celula; o imposibilitate?

Informatii despre cum se utilizeaza Microsoft Excel 2007. Calcule, Formule, Functii, Tabele pivot, Analiza datelor, etc
RAMBO
Mesaje: 414
Membru din: Mie Noi 25, 2009 2:17 pm
Localitate: Pitesti

Un (1) caracter/celula; o imposibilitate?

Mesaj de RAMBO » Joi Apr 08, 2010 1:08 pm

Cum fac (daca se poate asa ceva) ca intr-o celula sa introduc doar un caracter dupa care sa se autoselecteze celula urmatoare (celula din acelasi rind, dar coloana vecina), asa cum este in exemplul atasat. Adica acest lucru sa se intimple fara artificii din partea utilizatorului. Adica fara ENTER dupa fiecare caracter, pentru ca ar trece la urmatorul rind si se intinde pe verticala. Am un cod care la apasarea tastei ENTER dupa completarea unei anumite celule, duce "cursorul" la alta celula declarata. Dar asta implica ENTER dupa fiecare caracter. Vreau sa evit acest lucru. Ma tem ca este imposibil. Codul de care vorbeam este urmatorul (cu niste rangeuri aleatoare):

Cod: Selectaţi tot

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(False, False) = "D3" Then
If Range("d3") > 0 Then
Application.EnableEvents = False
Me.Range("f4").Select
Application.EnableEvents = True
End If
End If
End Sub
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.
Ultima oară modificat Joi Apr 08, 2010 1:11 pm de către Anonymous, modificat de 2 ori în total.
Motiv: Adaugare tag CODE si rectificare cod

Dr. Cloud
Mesaje: 3327
Membru din: Mar Oct 02, 2012 11:19 am

Re: Un (1) caracter/celula; o imposibilitate?

Mesaj de Dr. Cloud » Joi Apr 08, 2010 4:13 pm

Eu ti-am facut cu o formula sa iti separe un nume dintr-o celula.
Adica, introduci intr-o celula un nume si in tabel se extrage automat fiecare litera din acel nume.
Dar asta implica ENTER dupa fiecare caracter
Pai daca scrii un caracter intr-o celula sau orice altceva, atata timp cat nu dai un Enter sau apesi o alta tasta care permite validarea acelui text, cum ai vrea tu sa mearga mai departe?
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

Dr.Windows
Site Admin
Site Admin
Mesaje: 4527
Membru din: Vin Iul 31, 2009 7:32 am

Re: Un (1) caracter/celula; o imposibilitate?

Mesaj de Dr.Windows » Joi Apr 08, 2010 8:00 pm

Pentru ca din pacate nu exista un eveniment "OnKey" pentru excel ca sa poti captura tastele apasate, o alta varianta pentru rezolvarea problemei tale ar fi (tot cu VBA) folosirea unei forme care sa e activeze la intrarea in "range"-ul potrivit - sa preia textul "intreg" de la user si apoi sa-l "splituiasca" in celulele din range-ul respectiv cum se intampla in exemplul atasat:
OnKeyReplacement.jpg
Codul din spatele formei ar fi urmatorul:

Cod: Selectaţi tot

Private Sub cmdOK_Click()
    Dim cell As Range
    Dim i As Long
    
    'Sparge textul introdus in caractere
    i = 0
    cSplit = txtSplit.Value
    Dim aSplit() As Variant
    ReDim aSplit(1 To Len(cSplit))
    For i = 1 To Len(cSplit)
        aSplit(i) = Mid(cSplit, i, 1)
    Next i
    
    'sterge textul vechi
    Range("rngSplit").ClearContents
    
    'Scrie caracterele in celule
    i = 0
    For Each cell In Range("rngSplit")
        i = i + 1
        If i < Len(cSplit) + 1 Then
            cell.Value = aSplit(i)
        End If
    Next cell
    
    Unload Me

End Sub

Private Sub txtSplit_Enter()
    'Preselecteaza textul la intrarea in textbox
    frmText.txtSplit.SelStart = 0
    frmText.txtSplit.SelLength = Len(frmText.txtSplit.Value)
End Sub

Private Sub txtSplit_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    'Daca se apasa ENTER echivaleaza cu apasarea butonului OK
    If KeyCode = 13 Then   'sau KeyAscii = vbCrLf
        cmdOK_Click
    End If
End Sub

Private Sub txtSplit_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    'Daca se apasa ESC iese fara sa faca nimic
    If KeyAscii = 27 Then   'sau KeyAscii = vbKeyEscape
        Unload Me
    End If
End Sub
Iar pentru a activa formularul ar trebui sa pui urmatorul cod in Sheet1

Cod: Selectaţi tot

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim cell As Range
    Set isect = Application.Intersect(Target, Range("rngSplit"))
    If isect Is Nothing Then
        frmText.Hide
    Else
        'Initializare cu valoarea actuala a rangeului (daca exista)
        cSplit = ""
        For Each cell In Range("rngSplit")
            cSplit = cSplit & cell.Value
        Next cell
        
        frmText.txtSplit.Value = cSplit
        frmText.Show
        frmText.txtSplit.SetFocus
        
    End If

End Sub
Si fisierul "complet":
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

smcsa
Mesaje: 2805
Membru din: Mar Sep 29, 2009 7:29 pm
Localitate: Timisoara

Re: Un (1) caracter/celula; o imposibilitate?

Mesaj de smcsa » Vin Apr 09, 2010 10:41 am

RAMBO scrie:Adica fara ENTER dupa fiecare caracter, pentru ca ar trece la urmatorul rind si se intinde pe verticala.
La Excel Options - Advanced - Editing Options ai After pressing Enter, move selection si alegi de acolo ce vrei (informatia doar ca sa stii ca se poate si altceva decat pe coloana in jos)

RAMBO
Mesaje: 414
Membru din: Mie Noi 25, 2009 2:17 pm
Localitate: Pitesti

Re: Un (1) caracter/celula; o imposibilitate?

Mesaj de RAMBO » Lun Apr 12, 2010 8:21 am

Nu stiam ca se numeste eveniment "onkey", dar exact la asta faceam referire. Oricum in lipsa acestuia merge foarte bine si varianta cu VBA. Multumesc.

Dr.Windows
Site Admin
Site Admin
Mesaje: 4527
Membru din: Vin Iul 31, 2009 7:32 am

Re: Un (1) caracter/celula; o imposibilitate?

Mesaj de Dr.Windows » Lun Apr 12, 2010 5:50 pm

RAMBO scrie:Nu stiam ca se numeste eveniment "onkey", dar exact la asta faceam referire. Oricum in lipsa acestuia merge foarte bine si varianta cu VBA. Multumesc.
Cu placere... chiar daca evenimentul nu se numeste neaparat "OnKey"... depinde de aplicatie... la unele chiar asa se cheama... On Key, la altele On KeyPress (cum este si in evenimenul folosit in textbox-ul din exemplul de mai sus: txtSplit_KeyPress), etc... dar "pe acolo"... ;)

Scrie răspuns

Înapoi la “Intrebari despre Excel 2007”