Entrada do usuário para selecionar e preencher valor para células

0

Eu tenho esta tabela do excel: A2 a A11 são nomes de classe Class_1, Class_2, ..., Class_10. B1 a K1 são o nome do estudante 1,2,3, ..., 10

Para cada aluno de sua turma, precisarei preencher sua nota

Eu gostaria de ter uma caixa de entrada ou um formulário de usuário do VBA, então só precisarei responder a pergunta do inputbox ou userform para preencher a nota.

Eu imagino o inputbox ou userform assim: Classe: Class_1 'equivalente à linha da célula que, neste caso, linha 2 Estudante: 1 'equivalente à coluna da célula que, neste caso, coluna B Grau: A 'equivalente ao valor da célula que neste caso "A"

Portanto, se eu preencher Class_1,1, A, o VBA selecionará a célula B2 e preencherá o valor "A" para essa célula.

    
por Hien Le 16.09.2014 / 01:11

1 resposta

0

Esta é uma configuração básica do VBA de bare bones para esta solicitação. Eu suponho que você provavelmente gostaria de ajustá-lo um pouco para torná-lo um pouco mais. Ele apenas passa por cada combinação de Classe / Aluno em sua planilha e exibe uma caixa de entrada solicitando a nota.

Sub getGrades()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1") 'change this to your grade sheet

    Dim intRow As Integer
    Dim intColumn As Integer
    Dim intClassCount As Integer
    Dim intStudentCount As Integer
    Dim strResponse As String

    'get the last row in which a class is present and the last column in which a student is present
    intClassCount = ws.Range("A65000").End(xlUp).Row
    intStudentCount = ws.Range("IV1").End(xlToLeft).Column

    'run through all of the class/student combinations
    For intRow = 2 To intClassCount
        For intColumn = 2 To intStudentCount

            'Get the response
            strResponse = InputBox("Please enter grade for" & vbCrLf & vbCrLf & "Class: " & ws.Cells(intRow, 1) & vbCrLf & "Student: " & ws.Cells(1, intColumn), "Enter Grade")

            'May want to do some checking here to make sure strResponse is A,B,C,D, or F or whatever...
            ws.Cells(intRow, intColumn).Value = strResponse

        Next intColumn
    Next intRow

End Sub

Adicionando um método não-VBA que é provavelmente a melhor maneira de resolver isso. Como eu penso sobre a questão mais profunda, e me imagino tendo que inserir notas para dezenas de alunos espalhados por muitas classes, eu gostaria de:

  1. Crie uma nova guia de planilhas que liste cada aluno em uma coluna e suas respectivas classes em uma segunda coluna. Esta lista seria < # OfStudents > x < # OfClasses > longo. Você pode criar isso rapidamente copiando e colando ou editando o VBA acima para simplesmente colocar a combinação de classe / aluno em suas próprias linhas na nova planilha.

  2. Em uma terceira coluna na nova planilha (coluna C), você pode inserir sua nota. Com esse formato, uma nova planilha permitirá que você classifique e Ctrl + F (localizar) e o Filtro automático para segmentar apenas os alunos de que você gosta.

  3. De volta à planilha original na célula A3, você pode usar a seguinte fórmula para trazer a nota de alunos da nova planilha (eu chamarei a nova planilha "NewSheet") na fórmula:

=INDIRECT("NewSheet!C" & SUMPRODUCT((B$1=NewSheet!$A$1:$A$2000)*($A2=NewSheet!$B$1:$B$2000)*ROW(NewSheet!$A$1:$A$2000)))

A fórmula maluca do sumproduct retornará a linha na qual a combinação Estudante / Classe é encontrada em NewSheet, e o Indireto buscará a Nota daquela linha em particular.

Indo por esse caminho, você tem algumas vantagens. Primeiro, não há VBA. Não que o VBA seja uma coisa ruim, não é tão amplamente entendido como uma fórmula de folha. Segundo, você obtém um UserForm / Interface muito útil para inserir notas com NewSheet e AutoFiltering and Sorting e todas as outras sutilezas do Excel. Em terceiro lugar, você pode dimensionar isso para um milhão de combinações de alunos / classes sem mexer com o código. Basta copiar e colar a fórmula na sua matriz de Classes e Alunos em constante expansão e pronto.

    
por 16.09.2014 / 22:44