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 / coding / Perguntas / 77729585
Accepted
hbstha123
hbstha123
Asked: 2023-12-29 07:12:04 +0800 CST2023-12-29 07:12:04 +0800 CST 2023-12-29 07:12:04 +0800 CST

Se um valor corresponder às colunas de quaisquer duas linhas, quero destacar apenas o valor da linha que vem em segundo lugar no Excel usando VBA. Como?

  • 772

Estou tentando criar um calendário no Excel usando VBA. Parece como mostrado: insira a descrição da imagem aqui

A coluna B é a coluna do mês. O mês começa na coluna B na semana (linha) em que ocorre o primeiro dia do mês. Exemplo, fevereiro começa na linha 6, embora haja alguns últimos dias de janeiro na mesma linha.

Quero destacar os feriados. Por exemplo, tenho feriado em 1º de janeiro, destacado em ciano. Eu escrevi um código definindo um objeto de matriz bidimensional my_holidays(x,y). x refere-se ao mês e y refere-se ao dia com base no seguinte: insira a descrição da imagem aqui

Escrevi um código que procura o mês na coluna B e o dia nas colunas C a I e destaca se encontrar a correspondência:

Dim last_row As Integer
last_row = ws1.Range("B1").End(xlDown).row

Dim row As Integer
Dim column As Integer

For row = 1 To last_row
    For column = 3 To 9
        For i = 1 To num_holidays
            
            If ws1.Range("B" & row).Value = my_holidays(i, 1) And ws1.Cells(row, column).Value = my_holidays(i, 2) Then
                ws1.Cells(row, column).Interior.Color = vbCyan
            End If
            
            
        Next i
        
        
    Next column
    
Next row

Meu problema é que se eu tiver feriado em dias como 29 de março, ele destaca duas linhas aqui 10 e 14 conforme mostrado na imagem acima. No entanto, o 29º dia na linha 10 corresponde a fevereiro.

Como posso modificar meu código de forma que, se o feriado corresponder a duas linhas de um mês, ele selecione a segunda linha usando VBA no Excel?

excel
  • 2 2 respostas
  • 36 Views

2 respostas

  • Voted
  1. Best Answer
    taller
    2023-12-29T08:05:26+08:002023-12-29T08:05:26+08:00
    • Introduza a bFirstRowvariável para distinguir a primeira linha de cada mês.

    • Corrija a lógica para marcar 27 de fevereiro.

    • Faça um loop pelos dados da 2ª linha For row = 2, caso contrário, Cells(row - 1, 2)gerará erro.

        Dim row As Integer
        Dim column As Integer
        Dim bFirstRow As Boolean
        Dim sMth As String
        For row = 2 To last_row
            If ws1.Cells(row, 2) <> ws1.Cells(row - 1, 2) Then
                bFirstRow = True
            Else
                bFirstRow = False
            End If
            For column = 3 To 9
                If bFirstRow And ws1.Cells(row, column) > 20 Then
                    sMth = ws1.Cells(row - 1, 2)
                Else
                    sMth = ws1.Cells(row, 2)
                End If
                For i = 1 To num_holidays
                    If sMth = my_holidays(i, 1) And ws1.Cells(row, column).Value = my_holidays(i, 2) Then
                        ws1.Cells(row, column).Interior.Color = vbCyan
                    End If
                Next i
            Next column
        Next row
    

    Atualizar:

    Question: Se ele tivesse usado fevereiro na linha 10, acredito que isso não marcaria 02 de março.

        Dim row As Integer
        Dim column As Integer
        Dim sMth As String
        For row = 2 To last_row
            For column = 3 To 9
                sMth = ws1.Cells(row, 2)
                If ws1.Cells(row, 2) <> ws1.Cells(row - 1, 2) Then
                    If ws1.Cells(row, column) > 21 Then sMth = ws1.Cells(row - 1, 2)
                ElseIf ws1.Cells(row, 2) <> ws1.Cells(row + 1, 2) Then
                    If ws1.Cells(row, column) < 7 Then sMth = ws1.Cells(row + 1, 2)
                End If
                For i = 1 To num_holidays
                    With ws1.Cells(row, column)
                        If sMth = my_holidays(i, 1) And .Value = my_holidays(i, 2) Then
                            .Interior.Color = vbCyan
                        End If
                    End With
                Next i
            Next column
        Next row
    
    • 2
  2. kevin
    2023-12-29T08:02:31+08:002023-12-29T08:02:31+08:00

    Para este problema, você pode adicionar uma condição para verificar se o valor da célula é o valor mínimo até o final da linha. Isso indica que os números dos dias não foram redefinidos na mesma linha, portanto o mês não mudou.

        If ws1.Range("B" & row).Value = my_holidays(i, 1) And ws1.Cells(row, column).Value = my_holidays(i, 2) And ws1.Cells(row, column).Value = WorksheetFunction.Min(Range(ws1.Cells(row, column), ws1.Cells(row, 9))) Then
            ws1.Cells(row, column).Interior.Color = vbCyan
        End If
    

    Mas você já pensou: e se 27 de fevereiro fosse feriado? Você não tem nenhuma linha com 27 de fevereiro e 27 de fevereiro. Se você alterar a linha 10 para março, e se 27 de fevereiro e 2 de março fossem feriados?

    Atualizei porque seu calendário é um pouco inconsistente quanto ao mês que você escreve na coluna B quando a linha é dividida entre 2 meses. Isto deve cobrir todas as possibilidades.

    For row = 2 To last_row
        For column = 3 To 9
            For i = 1 To num_holidays
            
                If ws1.Cells(row, column).Value < 7 Then
                    
                    If ws1.Range("B" & row + 1).Value = my_holidays(i, 1) And ws1.Cells(row, column).Value = my_holidays(i, 2) Then
                        ws1.Cells(row, column).Interior.Color = vbCyan
                    End If
                
                ElseIf ws1.Cells(row, column).Value > 22 Then
                    
                    If ws1.Range("B" & row - 1).Value = my_holidays(i, 1) And ws1.Cells(row, column).Value = my_holidays(i, 2) Then
                        ws1.Cells(row, column).Interior.Color = vbCyan
                    End If
                
                Else
                
                    If ws1.Range("B" & row).Value = my_holidays(i, 1) And ws1.Cells(row, column).Value = my_holidays(i, 2) Then
                        ws1.Cells(row, column).Interior.Color = vbCyan
                    End If
                
                End If
                            
            Next i
                    
        Next column
        
    Next row
    
    • 1

relate perguntas

  • Como posso retornar linhas específicas onde EXISTE uma taxa no contrato listado, mas NÃO há taxa no sistema?

  • adicionar automaticamente um campo de referência em uma tabela quando alguns valores são repetidos?

  • percorrer a coluna com a alteração do endereço da célula

  • Pesquise uma string e os valores de saída correspondentes a essa string

  • Existe uma maneira no Excel de contar as ocorrências de um texto específico em uma string, mas também incluir o caractere anterior?

Sidebar

Stats

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

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +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