AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-3128903

Shiela's questions

Martin Hope
Shiela
Asked: 2025-04-26 20:28:13 +0800 CST

Como remover um valor durante a alteração do combobox

  • 6

Tenho aqui uma caixa de listagem que está funcionando bem com o código abaixo.

Caixa de Listagem 1

caixa de listagem

Código completo atualizado:

Option Explicit
Dim bInit As Boolean ' ** module-scoped variable

Private Sub UserForm_Initialize()
    bInit = True  ' ** set UserForm_Initialize mode **from Taller
    clearAll
    Me.cmbName.Value = "Nory"
    Dim ws As Worksheet: Set ws = Worksheets("Sheet1")
    Dim i As Long
    Dim arr: arr = ws.Range("B1").CurrentRegion.Value
    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")

    For i = 2 To UBound(arr)
        dict(arr(i, 2)) = arr(i, 1)
    Next
   ' ***
     If dict.exists(Me.cmbName.Value) Then
        Me.cmbTeam.Value = dict(Me.cmbName.Value)
        If Not cmbTeam.Value = "" And Not cmbDate.Value = "" And Not cmbName.Value = "" Then
            Team
            forListBoxUpdate 'calling forListBoxUpdate
            forDateCombobox 'filling in date dropdowns
            forNamesCombobox 'filling in names combobox as long as 3 comboboxes are not blank
        Else
            Team 'calling Team dropdowns in case team is blank or default cmbName value has no team
            cmbDate.Value = ""
            cmbName.Value = ""
        End If
    Else
            Team 'calling Team dropdowns in case team is blank or default cmbName value has no team
            cmbDate.Value = ""
            cmbName.Value = ""
    End If
    bInit = False  ' ** reset **from Taller
End Sub

Private Sub cmbDate_Change()
    If Not cmbTeam = "" And Not cmbName = "" Then
        forListBoxUpdate 'calling to show info if team and name not blank
        forNamesCombobox 'filling in cmbname dropdowns
    Else
        cmbDate.Clear 'if cmbteam and cmbname blank, cmdate should also be blank
    End If
End Sub

Private Sub cmbName_Change()
    forListBoxUpdate
End Sub

Private Sub cmbTeam_Change()
    cmbDate.Value = ""
    'cmbName.Value = "" 'issue, during initialize, default cmbname is removed.
    clearAll 'used this instead
    forDateCombobox 'fills in date dropdowns
End Sub



Sub forListBoxUpdate() 'to show info from sheets and to be called after the 3 comboboxes are filled
    Dim ws As Worksheet, colList As Collection
    Dim arrData, arrList, i As Long, j As Long
    
    Set colList = New Collection
    Set ws = Worksheets("Sheet2")
    arrData = ws.Range("A1:C" & ws.Cells(ws.Rows.count, "A").End(xlUp).Row)
    
        For i = 2 To UBound(arrData)
            If Format(arrData(i, 1), "mmmm yyyy") = Me.cmbDate.Value And arrData(i, 3) = Me.cmbName.Value Then
                colList.Add i, CStr(i)
            End If
    Next

    ReDim arrList(1 To colList.count + 1, 1 To UBound(arrData))
    For j = 1 To 3
        arrList(1, j) = arrData(1, j) ' header
        For i = 1 To colList.count
                arrList(i + 1, j) = arrData(colList(i), j)
        Next
    Next

    With Me.ListBox1
        .Clear
        .ColumnCount = UBound(arrData, 2)
        .list = arrList
    End With
    
    
    labelCount.Caption = ListBox1.ListCount - 1
End Sub

Sub clearAll() 'to clear comboboxes except teams
    If Not bInit Then cmbName.Value = ""  ' ** doesn't run when calling from UserForm_Initialize **from Taller
    cmbDate.Clear
    cmbName.Clear
    'cmbName.Value = ""
    ListBox1.Clear
End Sub

Sub Team() 'for adding the teams dropdown in cmbTeam
    clearAll
    Dim ws As Worksheet, _
        Dic As Object, _
        rCell As Range, _
        Key
    
    Set ws = Worksheets("Sheet1")
    Set Dic = CreateObject("Scripting.Dictionary")
    
    
    For Each rCell In ws.Range("A2", ws.Cells(Rows.count, "A").End(xlUp))
            If Not Dic.exists(rCell.Value) And Not rCell = "" Then
                Dic.Add rCell.Value, Nothing
            End If
    Next rCell
    
    For Each Key In Dic
        cmbTeam.AddItem Key
    Next
End Sub

Sub forNamesCombobox() 'for adding the names dropdown in cmbName
Dim ws As Worksheet, _
    Dic As Object, _
    rCell As Range, _
    Key

Set ws = Worksheets("Sheet1")
Set Dic = CreateObject("Scripting.Dictionary")


For Each rCell In ws.Range("B2", ws.Cells(Rows.count, "B").End(xlUp))
        If Not Dic.exists(rCell.Value) And rCell.Offset(0, -1) = cmbTeam.Value Then
            Dic.Add rCell.Value, Nothing
        End If
Next rCell

For Each Key In Dic
    cmbName.AddItem Key
Next
End Sub

Sub forDateCombobox() 'for adding the date dropdown in cmbDate
            Dim date1 As Variant
            Dim date2 As Variant
            date1 = Format(Now, "mmmm yyyy")
            date2 = Format(DateAdd("m", -1, CDate(date1)), "mmmm yyyy")
            
            With cmbDate
            .Clear
            .AddItem Format(date2, "mmmm yyyy")
            .AddItem Format(date1, "mmmm yyyy")
            .Value = Format(date1, "mmmm yyyy")
            End With
            
End Sub

Folha1

UM B
Equipe Nomes
Lory Lina
Jorge Nory
Jorge Máx.
Jack Dan

Folha2

UM B C
Data EU IA Nomes
25/03/2025 1101 Lina
25/04/2025 1102 Lina
25/03/2025 1103 Nory
25/04/2025 1104 Nory
25/03/2025 1105 Dan
25/04/2025 1106 Dan

Agora, durante o evento de alteração da caixa de combinação de equipes, gostaria que a caixa de combinação de nomes fosse limpa ("Nory" ou qualquer valor para cmbNamedeve ser removido e eliminado).

A partir do código acima, o snippet do evento de alteração de equipes é:

Private Sub cmbTeam_Change()
    cmbDate.Value = ""
    'cmbName.Value = "" 'issue, during initialize, default cmbname is removed.
    clearAll 'used this instead
    forDateCombobox 'fills in date dropdowns
End Sub

Sub clearAll() 'to clear comboboxes except teams
    If Not bInit Then cmbName.Value = ""  ' ** doesn't run when calling from UserForm_Initialize **from Taller
    cmbDate.Clear
    cmbName.Clear
    'cmbName.Value = ""
    ListBox1.Clear
End Sub

Mesmo que eu insira cmbName.Value = ""em sub clearAll, durante a inicialização, "Nory"ele será removido, o que eu não quero que seja removido na inicialização.

Como corrigir o código acima, onde durante a inicialização, "Nory" permanecerá, assim como Equipe e Data, e quando houver uma mudança de Equipe, as caixas de combinação de Data e Nome ficarão em branco.

Sua ajuda é muito apreciada.

excel
  • 1 respostas
  • 89 Views
Martin Hope
Shiela
Asked: 2025-04-25 20:11:13 +0800 CST

Como obter o nome exato da equipe usando Application.VLookup

  • 5

Folha1

Folha 1 img

Erro durante a inicialização:

erro

O que deve ser corrigido no código abaixo para obter o nome exato da equipe preenchido no Me.cmbTeam.Value (combobox) se o membro da equipe estiver correspondendo na coluna 2.

Private Sub UserForm_Initialize()
    Me.cmbDev.Value = "Nory"

    Dim ws As Worksheet: Set ws = Worksheets("Sheet1")
    Dim i As Long
    Dim arr: arr = ws.Range("B1").CurrentRegion.Value
    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    Dim teamName As Variant

    For i = 2 To UBound(arr)
        dict(arr(i, 2)) = Empty
    Next
   ' ***
   
    If dict.exists(Me.cmbDev.Value) Then
        teamName = Application.VLookup(Me.cmbDev.Value, ws.Range("B1").CurrentRegion.Value, 1, False)
        Me.cmbTeam.Value = teamName 'should get a result of George
    Else
        Me.cmbDev.Value = ""
        Me.cmbTeam.Value = ""
    End If

End Sub
excel
  • 1 respostas
  • 67 Views
Martin Hope
Shiela
Asked: 2025-04-05 20:49:04 +0800 CST

Como classificar dados da Planilha1 usando uma caixa de combinação com valores da Planilha2?

  • 6

Tenho aqui 2 folhas. 1 folha é para os dados principais. A outra folha é para as entradas de Times of the Name.

Folha 1 (os espaços em branco são propositais - para ver o resultado também se houver espaços em branco)

UM B C
Nome Data adicionada Data de modificação
Ana 11/03/2025 18/03/2025
Mav 11/03/2025 12/03/2025
Lisa 14/03/2025 13/03/2025
Ron 11/03/2025 14/03/2025
Mary 12/03/2025 15/03/2025
Kurt 13/03/2025 17/03/2025
15/03/2025
Kevin 16/03/2025

Folha2

UM B
Equipe Nome
Lúcia Ana
Lúcia Mav
Peter Lisa
Peter Ron
Nory Mary
Nory Kurt
Carlos Mona
Carlos Kevin

Caixa de listagem:

equipe errada

Gostaria de escolher equipes vindas da Planilha2. Tenho um código aqui abaixo, mas ele me dará o erro "Incompatibilidade de tipo".

showList é chamado durante a alteração do ComboBox:

Sub showList()
    Dim ws As Worksheet, colList As Collection
    Dim arrData, arrList, i As Long, j As Long
    Dim targetTeam As Variant
    ' *** 
    Dim ws2 As Worksheet: Set ws2 = Worksheets("Sheet2")
    Dim arr: arr = ws2.Range("B1").CurrentRegion.Value
    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(arr)
        dict(arr(i, 2)) = Empty
    Next
   ' ***

    Set colList = New Collection
    Set ws = Worksheets("Sheet1")
    arrData = ws.Range("A1:E" & ws.Cells(ws.Rows.count, "A").End(xlUp).Row)
    For i = 2 To UBound(arrData)
            targetTeam = Application.VLookup((arrData(i, 2)), ws2.Range("B1").CurrentRegion.Value, -1, False)
                If dict.exists(arrData(i, 1)) And cmbTeam = targetTeam Then
                    colList.Add i, CStr(i)
                End If

    Next
    ReDim arrList(1 To colList.count + 1, 1 To UBound(arrData))
    For j = 1 To 5
        arrList(1, j) = arrData(1, j) ' header
        arrList(1, 4) = "Date Added Duration"
        arrList(1, 5) = "Date Modified Duration"
        For i = 1 To colList.count
                arrList(i + 1, j) = arrData(colList(i), j)
                    Dim dateA As Variant
                    Dim dateB As Variant
                    Dim dateC As Variant
                    Dim difference1 As Long
                    Dim difference2 As Long
                
                ' Assign values to the dates
                dateA = arrList(i + 1, 2)
                dateB = arrList(i + 1, 3)
                dateC = Format(Now, "m/d/yyyy")
                
                ' Calculate the difference in days
                difference1 = DateDiff("d", dateA, dateC) 'date today minus date added
                
                If Not dateA = "" Then
                    If difference1 > 1 Then
                    arrList(i + 1, 4) = difference1 & " days"
                    Else
                    arrList(i + 1, 4) = difference1 & " day"
                    End If
                Else
                    arrList(i + 1, 4) = "Missing"
                End If
                
                difference2 = DateDiff("d", dateB, dateC) 'date today minus date modified
                
                If Not dateB = "" Then
                    If difference2 > 1 Then
                    arrList(i + 1, 5) = difference2 & " days"
                    Else
                    arrList(i + 1, 5) = difference2 & " day"
                    End If
                Else
                    arrList(i + 1, 5) = "Missing"
                End If
        Next
    Next
    With Me.ListBox1
        .Clear
        .ColumnCount = UBound(arrData, 2)
        .list = arrList
    End With
End Sub

Erro de incompatibilidade de tipo

código de erro

Desejado:

Resultado desejado

excel
  • 1 respostas
  • 63 Views
Martin Hope
Shiela
Asked: 2025-03-28 09:42:56 +0800 CST

Como retornar campos em branco em campos de texto após atualização da caixa de listagem no Excel VBA

  • 6

Tenho outro formulário aqui que exibe dados da Sheet1 durante a inicialização. Quando há seleção de item do Listbox ou evento Listbox afterupdate, o listbox retorna valores da Sheet2 de Dígitos selecionados (único com uma letra D) nos campos de texto:

Folha1

UM B C E
Dígitos Data1 Data2 Versão
D-12300 16/03/2025 16/03/2025 1-50-02
D-12347 17/03/2025 17/03/2025 1-50-03
D-12348 18/03/2025 18/03/2025 1-50-04

Folha2

UM B C E
Dígitos Descrição Data Versão
D-12345 Descrição1 15/02/2025 1-50-01
D-12346 Descrição1 16/03/2025 1-50-02
D-12347 Descrição2 17/03/2025 1-50-03
D-12348 Descrição3 18/03/2025 1-50-04
D-12349 Descrição1 19/03/2025 1-50-05

Caixa de listagem 1

Imagem1

Private Sub ListBox1_AfterUpdate()
    Me.txtSheet1Digits.Value = ""
    Me.txtSheet1Date1.Value = ""
    Me.txtSheet1Date2.Value = ""
    Me.txtSheet1Version.Value = ""
    Me.txtSheet1Digits = ListBox1.Column(0)
    Me.txtSheet1Date1 = ListBox1.Column(1)
    Me.txtSheet1Date2 = ListBox1.Column(2)
    Me.txtSheet1Version = ListBox1.Column(3)
Matches
End Sub

Um trecho de código usado na postagem anterior:

Sub Matches()
    Dim ws2 As Worksheet: Set ws2 = Worksheets("Sheet2")
    Dim i As Long
    Dim arr: arr = ws2.Range("A1").CurrentRegion.Value
    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    Dim targetDate As Variant
    Dim targetVersion As Variant
    For i = 2 To UBound(arr)
        dict(arr(i, 1)) = Empty
    Next

    If dict.exists(Me.txtSheet1Digits.Value) Then
        targetDate = Application.VLookup(Me.txtSheet1Digits.Value, ws2.Range("B1").CurrentRegion.Value, 3, False)
        targetVersion = Application.VLookup(Me.txtSheet1Digits.Value, ws2.Range("B1").CurrentRegion.Value, 4, False)
        Me.txtSheet2Date = targetDate
        Me.txtSheet2Version = targetVersion
    End If
            If Not Me.txtSheet1Date1 = Me.txtSheet2Date Or _
            Not Me.txtSheet1Version = Me.txtSheet2Version Then
            labelSheet1Date1.ForeColor = vbRed
            txtSheet1Date1.ForeColor = vbRed
            
            labelSheet1Date2.ForeColor = vbRed
            txtSheet1Date2.ForeColor = vbRed
            
            labelSheet2Date.ForeColor = vbRed
            txtSheet2Date.ForeColor = vbRed
            
            labelSheet1Version.ForeColor = vbRed
            txtSheet1Version.ForeColor = vbRed
            
            labelSheet2Version.ForeColor = vbRed
            txtSheet2Version.ForeColor = vbRed
            Else
            labelSheet1Date1.ForeColor = vbBlack
            txtSheet1Date1.ForeColor = vbBlack
            
            labelSheet1Date2.ForeColor = vbBlack
            txtSheet1Date2.ForeColor = vbBlack
            
            labelSheet2Date.ForeColor = vbBlack
            txtSheet2Date.ForeColor = vbBlack
            
            labelSheet1Version.ForeColor = vbBlack
            txtSheet1Version.ForeColor = vbBlack
            
            labelSheet2Version.ForeColor = vbBlack
            txtSheet2Version.ForeColor = vbBlack
            End If   
End Sub

Estou apenas imaginando qual poderia ser o erro abaixo:

Quando clico no primeiro item da caixa de listagem, ele lê a primeira condição If, e nada corresponde em Sheet2, que está correto, e retorna espaços em branco para dois campos de texto. Em seguida, ele lê a segunda condição, onde fica tudo vermelho - correto.

Imagem2

Quando clico no segundo item da caixa de listagem, a mesma leitura e agora vai para a condição else da segunda condição If, então fica tudo preto - correto.

Imagem3

Agora, quando clico novamente para o primeiro item, ele está lendo o mesmo padrão, mas não retorna mais espaços em branco para dois campos de texto. 2 campos de texto com setas continuam tendo os valores dos itens selecionados anteriormente - errado. Ele deveria estar retornando espaços em branco.

Imagem4

excel
  • 2 respostas
  • 33 Views
Martin Hope
Shiela
Asked: 2025-03-23 02:43:58 +0800 CST

Como exibir itens em uma caixa de listagem com a coluna 1 do Excel diferente de uma célula vazia

  • 6

Tenho uma planilha dinâmica aqui que gostaria de exibir apenas na caixa de listagem, colunas de A a F com coluna A/Nome diferente de célula nula/vazia.

UM B C E E F
Nome Pontuação Complexidade Pontos Total com pontos Total sem pontos
Tom 5 3 0,25 105,00% 100,00%
Brenda 5 4 0,5 110,00% 100,00%
Marca 5 - #VALOR! #VALOR!
- #VALOR! #VALOR!
- #VALOR! #VALOR!

Tentei isso abaixo durante a inicialização:

Sub forListBoxShow()
    Dim ws As Worksheet, colList As Collection
    Dim arrData, arrList, i As Long, j As Long
    Set colList = New Collection
    Set ws = Worksheets("Sheet1")
    arrData = ws.Range("A1:F" & ws.Cells(ws.Rows.count, "A").End(xlUp).Row)
    ' build collection of row numbers
    For i = 2 To UBound(arrData)
            If arrData(i, 1) <> vbNullString Then
                colList.Add i, CStr(i)
            End If
    Next
    ReDim arrList(1 To colList.count + 1, 1 To UBound(arrData))
    For j = 1 To 6
        arrList(1, j) = arrData(1, j) ' header
        For i = 1 To colList.count
                arrList(i + 1, j) = arrData(colList(i), j)
        Next
    Next
    listBoxShow.Clear
    With Me.listBoxShow
        .ColumnCount = UBound(arrData, 2)
        .ColumnWidths = "50,50,70,40,90,90"
        .list = arrList
    End With
End Sub

Mas estou recebendo subscript out of rangeerro. Também tentei adicionar valores reais a células que têm #VALUE!como Nome, "Mark", mas tenho o mesmo erro. (Para células com #VALUE! - tem fórmula padrão e tem propósito). Também tentei isso para o código acima, mas tenho o mesmo erro:

If Not arrData(i, 1) = "" Then

Agradeço sua ajuda.

excel
  • 2 respostas
  • 46 Views
Martin Hope
Shiela
Asked: 2025-03-22 09:24:10 +0800 CST

Como pular o cálculo de uma célula se a célula esquerda tiver um valor de erro

  • 4

Tenho dados brutos aqui.

UM B C E E F
Nome Pontuação Complexidade Pontos Total com pontos Total sem pontos
Tom 5 3 0,25 105,00% 100,00%
Brenda 5 4 0,5 110,00% 100,00%
Marca 5 #VALOR! 100,00%
eu M
Complexidade Pontos
5 1
4 0,5
3 0,25
2 0,15
1 0,05

Column B = Score- Dinâmica vinda dos usuários

Column C = Complexity (from users) and Column D = Pointstem tabela fixa. Na imagem abaixo, o usuário coloca em branco/sem Complexidade.

Imagem 1 imagem1

Column D = Points

Formula:
=IFERROR(VLOOKUP(C2,L1:M6,2,FALSE),"-")

Column E: Total with Points is based on sum of Score (B) and Points (D) divided by 5 (highest complexity of table).O formato da coluna é em Porcentagem.

Formula:
=(B2+D2)/5

Column F: Total without Points is based on Score (B) divided by 5 (highest complexity).O formato da coluna é em Porcentagem.

Formula:
=B2/5

Todas as fórmulas acima são aplicadas a cada coluna respectiva. Agora, estou obtendo 100,00% para a célula F4 por causa da fórmula aplicada para a coluna F. Por favor, veja a Imagem 1.

Como colocar uma fórmula para esta coluna que também mostrará um valor de erro se a célula da esquerda tiver um valor de erro, mas ainda dará o resultado para todas as outras células com valores usando (=B2/5).

Desejado:

Imagem2 Imagem2

Agradeço sua ajuda.

excel
  • 1 respostas
  • 47 Views
Martin Hope
Shiela
Asked: 2025-02-19 05:49:50 +0800 CST

Como definir o tamanho de uma planilha de subformulário pop-up para o tamanho de janela desejado abaixo

  • 6

Por favor, tenha paciência comigo, pois sou novo no Access VBA.

Tenho aqui um subformulário com uma planilha de dados que gostaria de exibir na Visualização Pop-Up.

formulário1

Se o Pop Up for Não, ele exibirá a página inteira.

imagem2

Se o Pop Up for Sim, ele exibirá apenas isto abaixo:

meia imagem

Estas são minhas propriedades:

Propriedades

Tentei definir o Redimensionamento automático como Não, e acontece a mesma coisa.

O que devo definir aqui nas propriedades para que pelo menos isso seja exibido automaticamente abaixo:

Aparecer Aparecer

vba
  • 1 respostas
  • 39 Views
Martin Hope
Shiela
Asked: 2024-12-30 14:10:59 +0800 CST

Como extrair um valor de uma tabela no Access VBA e exibi-lo em uma caixa de texto com base em um ID exclusivo exibido em outra caixa de texto?

  • 5

Por favor, tenha paciência comigo, pois sou novo no Access VBA.

Tenho uma caixa de texto aqui no Form2 nomeada txtEIDcom um Employee IDvalor que é passado de outro formulário.

Também tenho uma caixa de texto de exemplo chamada txtFullNameque deve preencher automaticamente o nome de uma pessoa da tabela tblEmployeescom campo de tabela EmployeeNameonde Form2.txtEID.valueé igual a EIDde tblEmployees.

Não sei como fazer o preenchimento automático na caixa de texto, mas para meu teste, tentei em uma ComboBox com esta linha abaixo em sua propriedade Rowsource:

SELECT [tblEmployees].[ID], [tblEmployees].[EmployeeName] FROM tblEmployees WHERE [tblEmployees].[EID] = [txtEID]; 

Ele está mostrando o valor desejado (nome da pessoa com base no EID de txtEID) no ComboBox, mas apenas como uma lista suspensa.

imagem

Como posso definir o valor da caixa de texto txtFullNamepara o nome de uma pessoa da tabela com base no EID exibido em txtEID. Também não sei como configurá-lo na txtFullNamepropriedade Control Source.

Esse tem sido meu problema por 6 horas. Sua ideia é muito apreciada.

vba
  • 1 respostas
  • 45 Views
Martin Hope
Shiela
Asked: 2024-12-16 05:54:39 +0800 CST

Consulta de acesso VBA em formato de data/hora

  • 6

Sou novo no Access e tenho um código aqui abaixo que deve inserir o mês atual em uma tabela através da data atual que tenho no meu PC subtraído de 1 hora:

strSQL = "INSERT INTO [mytable] ([monthColumn]) "
strSQL = strSQL & "VALUES ("
strSQL = strSQL & "#" & Format(Now - (1 / 24), "mmmm") & "#"
strSQL = strSQL & ");"

DoCmd.SetWarnings False
DoCmd.RunSQL (strSQL)
DoCmd.SetWarnings True

Eu também tentei isso:

strSQL = "INSERT INTO [mytable] ([monthColumn]) VALUES (#" & Format(Now - (1 / 24), "mmmm") & "#);"

DoCmd.SetWarnings False
DoCmd.RunSQL (strSQL)
DoCmd.SetWarnings True

Para ambos os códigos, estou recebendo este erro:

Imagem1

Eu apenas derivei os códigos acima de um código funcional abaixo:

strSQL = "INSERT INTO [mytable] ([monthColumn]) VALUES (#" & Now() & "#);"

O que pode estar faltando? Obrigado antecipadamente.

sql
  • 1 respostas
  • 32 Views
Martin Hope
Shiela
Asked: 2024-12-16 05:42:15 +0800 CST

Como formatar uma data geral para um mês distinto em uma lista suspensa de caixa de combinação no Access VBA?

  • 6

Tenho aqui um combobox que está obtendo valores de uma coluna Date de uma tabela. Então é assim que parece:

Imagem1

Existe alguma maneira de converter a lista de datas da caixa de combinação em meses distintos como este abaixo?

Imagem2

Dei uma olhada nesse método na resposta, mas ele está sendo usado no Excel e eu estou no Access e ainda sou novo no Access.

Ajuda é muito apreciada. Obrigado antecipadamente.

vba
  • 1 respostas
  • 26 Views
Martin Hope
Shiela
Asked: 2024-10-20 12:23:27 +0800 CST

Caso com condição/filtro de data VBA

  • 3

Usando o post anterior , adicionei:

  • Novas colunas que são Nome e Data
  • Novos 6 rótulos (contagens diárias e mensais de Dan, contagens diárias e mensais de Lisa, contagem diária total e contagens mensais)
  • Nova listbox2

Estou tendo um problema sobre como inserir uma condição de filtragem de data no caso em que o resultado do Listbox1 é para as entradas de hoje (diário), enquanto o Listbox2 é para as entradas do mês (mensal).

Estes são os dados brutos da Planilha Excel 1:

ID      Name    Status      Date
1201    Lisa    Pending A   10/14/2024
1202    Lisa    In progress 10/15/2024
1203    Dan     Pending A   10/16/2024
1204    Dan     Pending B   10/17/2024
1205    Dan     Pending C   10/17/2024
1206    Dan     Pending B   10/18/2024
1207    Lisa    Pending B   10/19/2024
1208    Dan     Pending B   10/19/2024
1209    Lisa    Pending A   10/19/2024

insira a descrição da imagem aqui

Este é o código derivado:

Private Sub UserForm_Initialize()
        
    ' Define constants.
    Const CRITERIA_COLUMN As Long = 3
    
    ' Return the values of the range in an array.
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim ws As Worksheet: Set ws = wb.Sheets("Sheet1")
    Dim rng As Range:
    Set rng = ws.Range("A1:D" & ws.Cells(ws.Rows.count, "C").End(xlUp).Row)
    Dim sRowsCount As Long: sRowsCount = rng.Rows.count
    Dim ColumnsCount As Long: ColumnsCount = rng.Columns.count
    Dim sData() As Variant: sData = rng.Value
    
    ' Return the matching source row numbers in a collection.
    Dim coll As Collection: Set coll = New Collection
    Dim sr As Long
    For sr = 2 To sRowsCount
        Select Case CStr(sData(sr, CRITERIA_COLUMN))
            Case "Pending A", "Pending B" '**** would like to put a date condition here or anywhere in the whole code to get result
                coll.Add sr
        End Select
    Next sr
    
    ' Define the destination array
    Dim dRowsCount As Long: dRowsCount = coll.count
    If dRowsCount = 0 Then Exit Sub ' no matches
    Dim dData() As Variant: ReDim dData(1 To dRowsCount, 1 To ColumnsCount)
    
    ' Loop through the items (matching source rows) of the collection
    ' to populate the destination array.
    Dim srItem As Variant, dr As Long, c As Long
    For Each srItem In coll
        dr = dr + 1
        For c = 1 To ColumnsCount
            dData(dr, c) = sData(srItem, c)
        Next c
    Next srItem
         
    ' Populate the listbox...
    With Me.ListBox1
        .ColumnHeads = True
        .ColumnWidths = "30,30,50,30"
        .ColumnCount = ColumnsCount
        .List = dData
    End With
    
    With Me.ListBox2
        .ColumnHeads = True
        .ColumnWidths = "30,30,50,30"
        .ColumnCount = ColumnsCount
        '.List = dData
    End With
    
    ' ... and the label.
    'LabelDanDaily.Caption =
    'LabelLisaDaily.Caption =
    
    'LabelDanMonthly.Caption =
    'LabelLisaMonthly.Caption =
    
    'LabelTotalDaily.Caption =
    LabelTotalMonthly.Caption = dRowsCount
        
End Sub

Esta é a saída desejada:

diáriomensal

Como obter as caixas de listagem de acordo com o filtro de data diário e mensal, bem como as contagens nos rótulos?

excel
  • 1 respostas
  • 82 Views
Martin Hope
Shiela
Asked: 2024-05-19 13:40:46 +0800 CST

Como vincular uma célula dinâmica da Planilha 1 à Planilha 2

  • 5

Tenho aqui a Folha 1 que contém um número de identificação que inseri manualmente.

Folha1

Imagem 1

O que eu gostaria de fazer com este número de ID é vincular à Folha 2 selecionando o(s) mesmo(s) número(s) de ID. Sempre que eu clicar no número de ID da Planilha 1, ele mostrará automaticamente a Planilha 2 selecionando as células com os mesmos números de ID que cliquei na Planilha 1. A Planilha 2 pode ter duplicatas e deve selecionar os mesmos IDs. Se não houver duplicata, basta selecionar uma célula com o mesmo ID.

Planilha2

Imagem 2

O que eu só sei é usar a função de link do Excel para ir para a Planilha 2 que mostra apenas a Planilha 2 inteira.

Folha 1 vinculada à folha 2

Imagem 3

A ajuda é muito apreciada.

excel
  • 2 respostas
  • 30 Views
Martin Hope
Shiela
Asked: 2024-04-07 06:05:54 +0800 CST

Como copiar uma linha de valores de uma planilha para outra com um clique na célula?

  • 5

Tenho uma pergunta de acompanhamento para esta pergunta anterior que tive. Não incluí essa pergunta lá para evitar confusão.

Portanto, já tenho uma função Enviar completa e funcional que salva tudo, desde a Página1 (Planilha1) até a Página2 (Planilha2).

Agora, sempre que clicar em um número de ticket aleatório na Página2, gostaria que ele fosse copiado para a Página3 (Planilha3) com seus detalhes preenchidos automaticamente - Data, Hora, Ticket, Pontuação e respostas Sim/Não/NA.

Página 2 insira a descrição da imagem aqui

Usando a imagem da Página2 acima, se qualquer célula com número de ticket no intervalo C for clicada, toda a sua linha de valores será copiada para a Página3.

Por exemplo, quando clico no Ticket 7789 2024,

Values of Date, Time, Ticket will go to cells E3:E5 of Page 3
Value of Score will go to J3 of Page3
Values of Yes/No/NA answers from Range E:BC of Page2 will go to cells E7:57 of Page3

Será exibido assim quando eu clicar no número do ticket 7789 2024 da imagem Page2 acima:

Página3 insira a descrição da imagem aqui

O que comecei é este código colocado no módulo da planilha Page2 (para ser sincero, não sei como continuar):

Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    
    Dim sh, sh2 As Worksheet
    Set sh = ThisWorkbook.Sheets("Page2")
    Set sh2 = ThisWorkbook.Sheets("Page3")
    
    
    If Selection.Count = 1 Then
        If Not Intersect(Target, sh.Range("C:C")) Is Nothing Then
            'Values of Date, Time, Ticket from Page2 will go to cells E3:E5 of Page 3
            'Value of Score from Page2 will go to J3 of Page3
            'Values of Yes/No/NA answers from Range E:BC of Page2 will go to cells E7:57 of Page3
        End If
    End If
End Sub

Sua ajuda é muito apreciada.

excel
  • 1 respostas
  • 50 Views
Martin Hope
Shiela
Asked: 2023-11-27 12:45:06 +0800 CST

Qual é a diferença entre Array("2023","2024","2025") e Array("2023,2024,2025") e Array(2023, 2024, 2025) no Excel VBA

  • 6

Eu tenho isso no meu código:

Dim cYear() As Variant

Não tenho certeza do que codificar a seguir. Deveria ser assim:

cYear = Array("2023","2024","2025")

ou

cYear = Array("2023,2024,2025")

ou

cYear = Array(2023, 2024, 2025)

Por favor, avise. Obrigado..

arrays
  • 2 respostas
  • 58 Views
Martin Hope
Shiela
Asked: 2023-10-15 08:05:06 +0800 CST

Obtenha o tempo total de uma exibição de coluna ListBox por alteração de ComboBox

  • 5

Tenho aqui um trecho de código para o evento de alteração do ComboBox4. Como você pode ver nos dados abaixo (formato de imagem excel), existe uma coluna para Tempo que tem meu formato preferido de “hh:mm:ss”. Estou tentando obter a soma da coluna tempo no ListBox (resultado mostrado no Label1 do Form). O resultado abaixo não está obtendo a soma correta.

Forma

Forma

Imagem de planilha do Excel (os espaços em branco têm uma finalidade) Imagem da planilha

Aqui estão os dados brutos da imagem acima:

Col. A         Col. B      Col. E       Col. G    Col. J           Col. L
YEAR      || NAME   || Total Time   || COLOR    || MONTH        || SHAPE
2023      || LINA   || 0:00:15      || GREEN    || AUGUST       || HEART
2023      || LINA   || 0:00:07      || GREEN    || SEPTEMBER    || CIRCLE
2024      || GARY   || 0:00:01      || GREEN    || SEPTEMBER    || DIAMOND
2024      || GARY   || 0:00:02      || GREEN    || SEPTEMBER    || RECTANGLE
2024      || GARY   || 0:00:15      || RED      || AUGUST       || OVAL
2023      || GARY   || 0:00:07      || RED      || AUGUST       || RECTANGLE
2023      || GARY   || 0:00:01      || GREEN    || AUGUST       || SQUARE
2024      || GARY   || 0:00:02      || GREEN    || SEPTEMBER    || STAR
2024      || TOM    || 0:00:15      || RED      || AUGUST       || HEART
2024      || TOM    || 0:00:07      || RED      || SEPTEMBER    || CIRCLE
2024      || TOM    || 0:00:01      || RED      || SEPTEMBER    || DIAMOND
2024      || TOM    || 0:00:02      || YELLOW   || SEPTEMBER    || OVAL
2024      || TOM    || 0:00:15      || YELLOW   || OCTOBER      || RECTANGLE
2024      || TOM    || 0:00:07      || YELLOW   || OCTOBER      || CIRCLE
2024      || TOM    || 0:00:01      || YELLOW   || OCTOBER      || SQUARE
2024      || TOM    || 0:00:02      || YELLOW   || OCTOBER      || STAR
2024      || TOM    || 0:00:15      || YELLOW   || OCTOBER      || STAR
2024      || TOM    || 0:00:07      || BLUE     || OCTOBER      || SQUARE

Aqui está o código do ComboBox4:

Option Explicit
Private Sub ComboBox4_Change()
    If Not ComboBox4.Value = "" Then
        Dim ws As Worksheet, rng As Range, count As Long, K As Long
        Dim arrData, arrList(), i As Long, j As Long
        Set ws = Worksheets("Sheet1")
        
        Dim countT As Date 'declared the variable here
        
        Set rng = ws.Range("A1:L" & ws.Cells(Rows.count, "B").End(xlUp).Row)
        arrData = rng.Value
        count = WorksheetFunction.CountIfs(rng.Columns(1), CStr(ComboBox2.Value), rng.Columns(2), ComboBox1.Value, rng.Columns(7), ComboBox3.Value, rng.Columns(10), ComboBox4.Value)
        ReDim arrList(1 To count + 1, 1 To UBound(arrData, 2))
        For j = 1 To UBound(arrData, 2)
            arrList(1, j) = arrData(1, j) 'header
        Next
        K = 1
                
        For i = 2 To UBound(arrData)
            If arrData(i, 2) = ComboBox1.Value And arrData(i, 1) = CStr(ComboBox2.Value) _
                And arrData(i, 7) = ComboBox3.Value And arrData(i, 10) = ComboBox4.Value Then
                K = K + 1
                
                countT = 0
                
                For j = 1 To UBound(arrData, 2)
                
                    countT = countT + arrData(i, 5) 'trying to get their total sum
                    
                    arrList(K, 5) = Format(arrData(i, 5), "hh:mm:ss")
                Next
                Label1.Caption = Format(CDate(countT), "hh:mm:ss") 'show total sum in this label in the form of hh:mm:ss
            End If
        Next
        With Me.ListBox1
            .ColumnHeads = False
            .ColumnWidths = "0,0,0,0,40,0,0,0,0,0,0,0"
            .ColumnCount = UBound(arrData, 2)
            .List = arrList
        End With
    End If
End Sub

Agradeço antecipadamente...

excel
  • 1 respostas
  • 34 Views
Martin Hope
Shiela
Asked: 2023-10-08 14:16:29 +0800 CST

Mostrar dados filtrados em ComboBoxes em cascata e ListBox1

  • 5

Eu tenho aqui ComboBoxes em cascata quando filtrados, serão exibidos corretamente no ListBox1. Abaixo estão meus dados da Planilha1 (não se importe como eles estão organizados, pois têm uma finalidade e adicionarei mais dados nessas células em branco):

Dados da planilha1

Dados brutos da planilha 1:

Col. A    Col. B   Col. G    Col. J    Col. L
YEAR    || NAME || COLOR || MONTH    || SHAPE
2023    || LINA || GREEN || AUGUST   || HEART
2023    || LINA || GREEN || SEPTEMBER|| CIRCLE
2024    || GARY || GREEN || SEPTEMBER|| DIAMOND
2024    || GARY || RED   || AUGUST   || OVAL
2023    || GARY || RED   || AUGUST   || RECTANGLE
2023    || GARY || GREEN || AUGUST   || SQUARE
2024    || GARY || GREEN || SEPTEMBER|| STAR
2024    || TOM  || RED   || AUGUST   || HEART
2024    || TOM  || RED   || SEPTEMBER|| CIRCLE
2024    || TOM  || RED   || SEPTEMBER|| DIAMOND
2024    || TOM  || YELLOW|| SEPTEMBER|| OVAL
2024    || TOM  || YELLOW|| OCTOBER  || RECTANGLE
2024    || TOM  || BLUE  || OCTOBER  || SQUARE

Agora, meu desafio é que os ComboBoxes 2 a 5 não listam os dados esperados durante o filtro. Como você pode ver abaixo, filtrei desta forma, mas há um mês adicional adicionado no ComboBox 4:

Filtro Gary

Quando deveria ser apenas neste mês (quando filtrado manualmente na planilha):

só mês de agosto

Além disso, fiz outro filtro para outro nome abaixo, mas o ComboBox5 está mostrando todas as formas exclusivas em vez de apenas o Coração.

todas as formas estão aparecendo

Resultado esperado para ComboBox5 (quando filtrado manualmente na planilha):

deveria ser apenas coração

Este é o meu código para os ComboBoxes em cascata:

Option Explicit
Private Sub ComboBox4_Change()
''''''**************************** Different Tasks Not Equal to No Ticket
  If Not ComboBox4.Value = "" Then
    With Me.ComboBox5
        .Enabled = True
        .BackColor = &HFFFF&
        
        Dim ws As Worksheet
        Dim rcell As Range, Key
        Dim dic As Object: Set dic = CreateObject("Scripting.Dictionary")
        Set ws = Worksheets("Sheet1")
            
        .Clear
        .Value = vbNullString
        
            For Each rcell In ws.Range("B2", ws.Cells(Rows.count, "B").End(xlUp))
                    If rcell.Offset(0, 0) <> ComboBox1.Value And rcell.Offset(0, -1) <> ComboBox2.Value And rcell.Offset(0, 5) <> ComboBox3.Value And rcell.Offset(0, 8) <> ComboBox4.Value Then
                    Else
                        If Not dic.Exists(rcell.Offset(, 10).Value) Then
                            dic.Add rcell.Offset(, 10).Value, Nothing
                        End If
                    End If
            Next rcell
            For Each Key In dic
                Me.ComboBox5.AddItem Key
            Next
    End With
Else
     With Me.ComboBox5
     .Clear
    .Enabled = False
    .BackColor = &HFFFFFF
    End With
End If
End Sub
Private Sub ComboBox3_Change()
If Not ComboBox3.Value = "" Then
    With Me.ComboBox4
        .Enabled = True
        .BackColor = &HFFFF&
        
        Dim ws As Worksheet
        Dim rcell As Range, Key
        Dim dic As Object: Set dic = CreateObject("Scripting.Dictionary")
        Set ws = Worksheets("Sheet1")
            
        .Clear
        .Value = vbNullString
        
            For Each rcell In ws.Range("B2", ws.Cells(Rows.count, "B").End(xlUp))
                    If rcell.Offset(0, 0) <> ComboBox1.Value And rcell.Offset(0, -1) <> ComboBox2.Value And rcell.Offset(0, 5) <> ComboBox3.Value Then
                    Else
                        If Not dic.Exists(rcell.Offset(, 8).Value) Then
                            dic.Add rcell.Offset(, 8).Value, Nothing
                        End If
                    End If
            Next rcell
            For Each Key In dic
                Me.ComboBox4.AddItem Key
            Next
    End With
    Me.ComboBox5.Clear
Else
     With Me.ComboBox4
     .Clear
    .Enabled = False
    .BackColor = &HFFFFFF
    End With
    Me.ComboBox5.Clear
End If
End Sub

Private Sub ComboBox2_Change()
If Not ComboBox2.Value = "" Then
    With Me.ComboBox3
        .Enabled = True
        .BackColor = &HFFFF&
        
        Dim ws As Worksheet
        Dim rcell As Range, Key
        Dim dic As Object: Set dic = CreateObject("Scripting.Dictionary")
        Set ws = Worksheets("Sheet1")
            
        .Clear
        .Value = vbNullString
        
            For Each rcell In ws.Range("B2", ws.Cells(Rows.count, "B").End(xlUp))
                    If rcell.Offset(0, 0) <> ComboBox1.Value And rcell.Offset(0, -1) <> ComboBox2.Value Then
                    
                    Else
                        If Not dic.Exists(rcell.Offset(, 5).Value) Then
                            dic.Add rcell.Offset(, 5).Value, Nothing
                        End If
                    End If
               ' Next rYear
            Next rcell
            For Each Key In dic
                Me.ComboBox3.AddItem Key
            Next
    End With
        Me.ComboBox4.Clear
        Me.ComboBox5.Clear
Else
     With Me.ComboBox3
     .Clear
    .Enabled = False
    .BackColor = &HFFFFFF
    End With
    Me.ComboBox4.Clear
    Me.ComboBox5.Clear
End If

End Sub
Private Sub ComboBox1_Change() 'done
If Not ComboBox1.Value = "" Then
    With Me.ComboBox2
        .Enabled = True
        .BackColor = &HFFFF&
        
        Dim ws As Worksheet
        Dim rcell As Range, Key
        Dim dic As Object: Set dic = CreateObject("Scripting.Dictionary")
        Set ws = Worksheets("Sheet1")
            
        .Clear
        
            For Each rcell In ws.Range("B2", ws.Cells(Rows.count, "B").End(xlUp))
                    If rcell.Value = ComboBox1.Value Then
                        If Not dic.Exists(rcell.Offset(, -1).Value) Then
                            dic.Add rcell.Offset(, -1).Value, Nothing
                        End If
                    End If
            Next rcell
            For Each Key In dic
                Me.ComboBox2.AddItem Key
            Next
    End With
        Me.ComboBox3.Clear
        Me.ComboBox4.Clear
        Me.ComboBox5.Clear
Else
     With Me.ComboBox2
     .Clear
    .Enabled = False
    .BackColor = &HFFFFFF
    End With
    Me.ComboBox3.Clear
    Me.ComboBox4.Clear
    Me.ComboBox5.Clear

End If

End Sub

Private Sub UserForm_Initialize()
    
Dim ws As Worksheet
Dim rcell As Range
'dim dic as Object: set dic = createobject("Scripting.Dictionary")
Set ws = Worksheets("Sheet1")

ComboBox1.Clear

With CreateObject("scripting.dictionary")
For Each rcell In ws.Range("B2", ws.Cells(Rows.count, "B").End(xlUp))
If Not .Exists(rcell.Value) Then
.Add rcell.Value, Nothing
End If
Next rcell
ComboBox1.List = .Keys

End With
    With Me.ComboBox2
    .Enabled = False
    .BackColor = &HFFFFFF
    End With
    With Me.ComboBox3
    .Enabled = False
    .BackColor = &HFFFFFF
    End With
    With Me.ComboBox4
    .Enabled = False
    .BackColor = &HFFFFFF
    End With
    With Me.ComboBox5
    .Enabled = False
    .BackColor = &HFFFFFF
    End With
End Sub

O que poderia dar errado nos meus códigos ComboBoxes para não obter a lista correta conforme o esperado durante o filtro? E ainda não tenho um código para mostrar os dados filtrados no ListBox1. Minha saída desejada é mostrar as entradas filtradas com colunas completas (incluindo as colunas em branco, já que colocarei alguns dados nesses espaços em branco apenas para fins de exibição junto com as entradas filtradas) em ListBox1 durante a alteração do ComboBox5 como esta abaixo, exceto que deveria estar em ListBox1. Por favor ajude. Agradeço antecipadamente.

resultado esperado

excel
  • 1 respostas
  • 54 Views
Martin Hope
Shiela
Asked: 2023-09-24 19:05:35 +0800 CST

Exibir caixa de listagem de acordo com Application.UserName atual

  • 6

Tenho aqui um código derivado de uma resposta que exibe o listbox corretamente na data atual. Se eu tiver uma coluna B que armazena nomes de usuário diferentes, quero inserir isto no código:

Se o nome de usuário atual (Application.UserName) no formulário ativo for igual a um dos nomes na coluna B, filtre as entradas hoje apenas para esse nome de usuário

Saída atual:

A caixa de listagem é filtrada na data atual usando o código abaixo

Saída desejada

A mesma Listbox é filtrada na data atual e no nome de usuário atual usando o código abaixo com um código adicional para filtragem de nome de usuário

Atualizar

Estes são os dados brutos:

Username       ||Date            ||Start Time    ||Color

Murray, Leo W  ||9/24/2023       ||9:08:28 AM    ||white

Murray, Leo W  ||9/24/2023       ||9:10:06 AM    ||black

Murray, Leo W  ||9/24/2023       ||9:12:09 AM    ||gray

Murray, Leo W  ||9/24/2023       ||9:13:13 AM    ||blue

Murray, Leo W  ||9/24/2023       ||5:34:03 AM    ||yellow

Smith, Pia Y   ||9/24/2023       ||6:02:59 AM    ||green

Smith, Pia Y   ||9/24/2023       ||6:05:57 AM    ||red

McGrath, Sam O ||9/24/2023       ||6:09:30 AM    ||brown

McGrath, Sam O ||9/24/2023       ||6:13:59 AM    ||white

McGrath, Sam O ||9/24/2023       ||6:17:29 AM    ||green

McGrath, Sam O ||9/24/2023       ||6:38:55 AM    ||white

McGrath, Sam O ||9/24/2023       ||6:41:07 AM    ||gray

Blake, Gary K  ||9/24/2023       ||6:42:03 AM    ||red

Blake, Gary K  ||9/24/2023       ||6:43:31 AM    ||rare white

Blake, Gary K  ||9/24/2023       ||6:43:31 AM    ||rare white

Blake, Gary K  ||9/24/2023       ||8:52:26 AM    ||trial

McGrath, Sam O ||9/24/2023       ||7:59:33 PM    ||red

Imagem de dados brutos: imagem de dados brutos

Código derivado atualizado incluindo a resposta de Taller abaixo:

Private Sub defineConstants()
     ' Define constants.
Const SRC_SHEET As String = "ExcelEntryDB"
Const SRC_FIRST_CELL As String = "B1" ‘’’*************changed from C1 to B1
Const DST_SHEET As String = "ExcelEntryDB" ' !!!
Const DST_FIRST_CELL As String = "K1" ' !!! ‘’’’*************changed from H1 to K1
Const DST_COLUMN_FORMATS As String = "mm\/dd\/yyyy;hh:mm:ss AM/PM;@"
Const DST_COLUMN_FORMATS_DELIMITER As String = ";"
Const LBX_COLUMN_WIDTHS As String = "75;75;75;75"
Const USER_COLUMN As Long = 1 ‘’****************from the answer below
Const CRITERIA_COLUMN As Long = 2
Const DST_SORT_COLUMN As Long = 3
Dim dSortOrder As XlSortOrder: dSortOrder = xlDescending
'Dim CriteriaDate As Date: CriteriaDate = Date - (13 / 24) ' =TODAY()
Dim CriteriaDate As Date: CriteriaDate = Format(Date - (13 / 24), "mm/dd/yyyy")
Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
' Write the source data to the source array.
Dim cCount As Long: cCount = UBound(Split(LBX_COLUMN_WIDTHS, ";")) + 1
Dim sws As Worksheet: Set sws = wb.Sheets(SRC_SHEET)
Dim hrg As Range: Set hrg = sws.Range(SRC_FIRST_CELL).Resize(, cCount)
Dim srg As Range, srCount As Long
With hrg.Offset(1)
        Dim lCell As Range: Set lCell = .Resize(sws.Rows.Count - .Row + 1) _
            .Find("*", , xlFormulas, , xlByRows, xlPrevious)
        If lCell Is Nothing Then
            'MsgBox "No data in worksheet.", vbCritical
        With Me.ListBox1
            .ColumnCount = cCount
            .ColumnHeads = True
            .ColumnWidths = LBX_COLUMN_WIDTHS
            '.RowSource = ddrg.Address(External:=True)
        End With
            Exit Sub
        End If
        srCount = lCell.Row - .Row + 2
       Set srg = .Resize(srCount)
End With
   ' Check if the date criterion was found.
    Dim crg As Range: Set crg = srg.Columns(CRITERIA_COLUMN)
    Dim drCount As Long:
    drCount = Application.CountIf(crg, CriteriaDate)
    If drCount = 0 Then
        MsgBox "No matches found.", vbCritical
        Exit Sub
    End If
    Dim sData(): sData = Union(hrg, srg).Value
    ' Return the headers and matching rows in the destination array.
    Dim dData(): ReDim dData(1 To drCount + 1, 1 To cCount)
    Dim sValue, sr As Long, dr As Long, c As Long, WriteRow As Boolean
    Dim sUser As String '''''''''''''''''''''**from the answer
For sr = 1 To srCount
        If sr = 1 Then ' headers
            WriteRow = True
        Else ' data rows
            sValue = sData(sr, CRITERIA_COLUMN)
            sUser = sData(sr, USER_COLUMN) ‘’****************from the answer below
            If IsDate(sValue) Then
                If sValue = CriteriaDate And sUser = "McGrath, Sam O" Then ‘’****************from the answer below
                'If sValue = CriteriaDate Then
                    WriteRow = True
                End If
            End If
        End If
        If WriteRow Then
            WriteRow = False
            dr = dr + 1
            For c = 1 To cCount
                dData(dr, c) = sData(sr, c)
            Next c
        End If
    Next sr
      ' Write the values from the destination array to the destination range.
    Dim dws As Worksheet: Set dws = wb.Sheets(DST_SHEET)
    Dim drg As Range: Set drg = dws.Range(DST_FIRST_CELL).Resize(dr, cCount)
    drg.Value = dData
    drg.Resize(dws.Rows.Count - drg.Row - dr + 1).Offset(dr).Clear


    ' Sort and format the destination data range.
         If dr = 1 Then
            MsgBox "Nothing"
        End If
        ' Reference the destination data range (no headers).
        Dim ddrg As Range: Set ddrg = drg.Resize(dr - 1).Offset(1)
' Sort the data range.
    If DST_SORT_COLUMN >= 1 And DST_SORT_COLUMN <= cCount Then
        ddrg.Sort ddrg.Columns(DST_SORT_COLUMN), dSortOrder, , , , , , xlNo
    End If
    ' Write the formats to a string array.
    Dim dcFormats() As String:
    dcFormats = Split(DST_COLUMN_FORMATS, DST_COLUMN_FORMATS_DELIMITER)
    ' Apply the formats to each column of the data range.
    For c = 0 To UBound(dcFormats)
        ddrg.Columns(c + 1).NumberFormat = dcFormats(c)
    Next c
    ' Tie the row source of the listbox to the destination data range.
    ' The headers are automatically recognized.
    With Me.ListBox1
        .ColumnCount = cCount
        .ColumnHeads = True
        .ColumnWidths = LBX_COLUMN_WIDTHS
        .RowSource = ddrg.Address(External:=True)
    End With
End Sub

Ele está obtendo o resultado para o nome de usuário declarado conforme a resposta (neste caso para McGrath), exceto que a data mudou para 12h00 e a hora tornou-se decimais no resultado:

Resultado Excel resultado excel

Resultado da caixa de listagem resultado da caixa de listagem

Agradecemos antecipadamente pela ajuda

excel
  • 1 respostas
  • 51 Views
Martin Hope
Shiela
Asked: 2023-09-24 11:47:46 +0800 CST

Caixa de listagem para planilha do Excel

  • 5

Tenho aqui uma listbox que é filtrada pelo nome de uma pessoa. Quando um nome é escolhido em uma caixa de combinação, a caixa de listagem é preenchida corretamente. O que eu gostaria de conseguir é que quando a caixa de listagem for exibida, ela coloque as entradas de tempo em zeros (veja a Figura 3).

Figura 1 (Nome Escolhido 1) nome escolhido 1

Figura 2 (Nome Escolhido 2) nome escolhido 2

Codificado manualmente na planilha Excel:

Implementation                 ||  Arizona || New York  || Louisiana|| Michigan
Total Hours Worked (hh:mm:ss)  ||     0    ||    0      ||    0     ||    0
Average Hours (hh:mm:ss)       ||     0    ||    0      ||    0     ||    0

Figura 3 Figura 3

Esta é a saída desejada para o Nome Escolhido 1: resultado1

Este é o meu resultado desejado para o Nome Escolhido 2:

resultado2

Este é o resultado que obtenho ao escolher o Nome 1.

resultado3

Este é o resultado que obtenho ao escolher o Nome 2.

resultado4

Este é o meu código para salvar a caixa de listagem na planilha:

        Dim sh As Worksheet

        Set sh = ThisWorkbook.Sheets("Sheet4")

        Dim n As Long



        For n = 1 To Me.ListBox2.ListCount - 1

        sh.Range("A" & Rows.Count).End(xlUp).ClearContents

        sh.Range("A" & Rows.Count).End(xlUp).Offset(1, 0) = Me.ListBox2.List(n, 0)

        sh.Range("A" & Rows.Count).End(xlUp).Offset(0, 1) = Me.ListBox2.List(n, 1)

        sh.Range("A" & Rows.Count).End(xlUp).Offset(0, 2) = Me.ListBox2.List(n, 2)

       

        Next n

Tenho aqui um código pronto para gráfico, mas irei usá-lo apenas quando o código para salvar entradas da caixa de listagem no Excel já estiver corrigido.

            'Dim CurrentFileName As String

            'CurrentFileName = ThisWorkbook.Path & "\current.gif"

              

            'Dim CurrentChart As Chart

            'Set CurrentChart = ThisWorkbook.Sheets("Sheet4").ChartObjects("Chart 1").Chart

            'CurrentChart.Export Filename:=CurrentFileName, FilterName:="GIF"

              

            'UserForm3.Image1.Picture = LoadPicture(CurrentFileName)

Por favor, diga-me onde estou errando. TY

excel
  • 1 respostas
  • 42 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve