1 votes

Création d'une macro Excel pour une saisie rapide des données :: : VBA :: : Excel :: :

J'ai pour mission de saisir les résultats d'une enquête (sous forme papier) dans Excel. Je n'ai jamais écrit de macro dans Office :(

Voici ce dont j'ai essentiellement besoin :

  1. J'ai des colonnes prédéfinies (|A|B|...|AG|AH|)
  2. Toutes les enquêtes sont regroupées en groupes. Toutes les enquêtes d'un même groupe ont quelques colonnes identiques (comme prédéfinies). Ce sont toujours les mêmes colonnes qui "définissent" le groupe.
  3. Toutes les autres réponses à l'enquête sont de type numérique [1..10].
  4. Les colonnes ne sont pas dans le même ordre que les réponses du sondage.
  5. Je veux une macro qui prenne mon entrée (par exemple '1575'), et place d'abord des valeurs prédéfinies dans ce 'groupe' en |A| |B| |C|, puis |E| = 1, |D| = 5, |F| = 7, |G| = 5, et commence automatiquement à saisir la ligne suivante.

Tout ce qui peut me donner un indice sur la façon d'écrire cette macro est le bienvenu.

Un grand merci pour avoir lu ceci...

EDIT1 : Je suppose que la question n'est pas assez claire... J'ai besoin d'une macro qui lise mon entrée clavier ('1575') et écrive les entiers '1' '5' '7' et '5' dans des lignes prédéfinies. Pour l'instant, j'ai l'idée de faire un formulaire, mais j'ai besoin d'un gestionnaire d'événement qui changera le focus sur l'entrée suivante lorsque j'appuierai sur une touche, car je veux éviter d'appuyer sur TAB tout le temps...

2voto

Fionnuala Points 67259

Il me semble que vous avez besoin d'un petit formulaire utilisateur avec juste une zone de texte, une plage pour montrer l'ordre de saisie des données, par exemple :

Groupe A | E | D | F | G

Et un petit code pour aller avec le formulaire, par exemple :

Dim LastCol As Integer
Dim CurRow As Integer

Private Sub UpdateCells()
Dim Col As Variant
Dim ColumnOrder As Range

'Range that specifies data entry order'
Set ColumnOrder = Range("A3:A15")

LastCol = LastCol + 1

If LastCol > WorksheetFunction.CountA(ColumnOrder) Then
    LastCol = 1
    CurRow = CurRow + 1
End If

Col = Range("A3").Offset(0, LastCol)
Range(Col & CurRow) = TextBox1.Value
TextBox1 = ""

End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
    UpdateCells
End If
End Sub

Private Sub UserForm_Initialize()
CurRow = ActiveCell.Row
End Sub

Édition Re Commentaire

Dans Excel, la dernière rangée peut être un peu délicate car Excel ne met pas à jour la gamme après les suppressions jusqu'à ce que le classeur soit enregistré. L'une de ces solutions peut convenir :

Function FindLastRow()
'Assuming that data starts in A1'
r = ActiveSheet.UsedRange.Rows.Count
c = ActiveSheet.UsedRange.Columns.Count
FindLastRow = r
End Function

.

Sub LastRow()
LastRowA = ExecuteExcel4Macro("GET.DOCUMENT(10)")
LastRowB = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
End Sub

Pour plus d'informations : http://www.tek-tips.com/faqs.cfm?fid=2115

1voto

Dick Kusleika Points 15230
Private Sub Worksheet_Change(ByVal Target As Range)

    Dim sText As String

    Application.EnableEvents = True

    If Target.Column = 1 Then  'Four digits entered in col A
        sText = CStr(Target.Value) 'convert to string
        If Len(sText) = 4 Then
            Target.Offset(0, 4).Value = Left$(sText, 1) 'write to E
            Target.Offset(0, 3).Value = Mid$(sText, 2, 1) 'D
            Target.Offset(0, 5).Value = Mid$(sText, 3, 1) 'F
            Target.Offset(0, 6).Value = Mid$(sText, 4, 1) 'G
        End If
    End If

    Application.EnableEvents = True

End Sub

Si vous saisissez vos quatre chiffres dans la colonne A, cela les répartira dans les bonnes colonnes. Il va dans le module de la feuille de calcul, pas dans un module standard.

-1voto

Tin Wizard Points 1024

Si je comprends bien la question, vous voulez que l'utilisateur puisse uniquement taper des chiffres, sans utiliser la touche Entrée ou la flèche pour finaliser la saisie.

Par exemple, en tapant "1253216..." au lieu de "1 2 5 ...".

Si c'est le cas, il n'existe malheureusement pas d'événement correspondant aux caractères individuels entrant dans la barre de formule. Les seuls événements qui sont vaguement liés sont la modification de la sélection et la modification. Cependant, je ne pense pas qu'il soit possible de les utiliser à cette fin (ils ne sont pas déclenchés pendant la saisie dans la barre de formule).

Une idée : Créez une colonne d'entrée au format texte et demandez aux utilisateurs de taper les réponses dans une grande chaîne (comme "1253216", etc.), puis mettez des formules dans chacune des autres cellules qui analysent le nième caractère de la colonne d'entrée et le transforme en une valeur. Par exemple :

Appliquez le nom de plage "Entrées" à la colonne A, le nom de plage "N" à la ligne 1, puis dans n'importe quelle autre cellule, mettez cette formule :

=VALUE(MID(Inputs,N,1))

L'inconvénient est que l'utilisateur ne saura pas s'il a commis une erreur avant d'avoir fini de taper toute la chaîne de chiffres et d'avoir appuyé sur la touche Entrée ou sur la flèche.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X