/ / Excel VBA - Jak wybrać zakres odpowiadający wartościom z poprzednich komórek? - excel, search, excel-vba, selection, vba

Excel VBA - Jak wybrać zakres odpowiadający wartościom z poprzednich komórek? - excel, search, excel-vba, selection, vba

Mam bardzo duży zestaw danych, które obejmują czasy rozpoczęcia i zakończenia lotu samolotów w NAS. Chcę utworzyć makro, aby wizualnie przedstawić te dane w programie Excel, na przykład:

(uwaga: ten obraz wykorzystuje fałszywe dane)

Jak widać, wykonałem pierwsze 7 wierszystrony, ale istnieje kilka plików danych z aż 2500 wierszy, co sprawia, że ​​proces jest nużący. Próbowałem stworzyć makro, ale nie wiem, jak wyszukiwać i wybrać odpowiedni zakres do podkreślenia.

Oto, co mam do tej pory:

Sub autofill()

Dim rng As Range
Dim row As Range
Dim cell As Range

"set the range of the whole search area
Set rng = Range("A2:HJ121")

For Each row In rng.Rows
Dim callsign As Variant
Set callsign = cell("contents", "A" & row)
Dim valstart As Variant
Set valstart = cell("contents", "E" & row)
Dim valstop As Variant
Set valstop = cell("contents", "F" & row)

"now select the range beginning from the column whose header matches the
"time in valstart and ends at the time which matches the time in valstop

Selection.Merge
Selection.Style = "Highlight"
Selection.Value = callsign
Next row

End Sub

Jaki jest najłatwiejszy sposób wyboru wierszy, których potrzebuję?

Z zawodu nie jestem programistą, z góry przepraszam, jeśli mój kod demonstruje niechlujstwo lub narusza niektóre święte zasady programowania.

Dzięki!

Odpowiedzi:

1 dla odpowiedzi № 1

Oto moja decyzja w VBA.

Option Explicit

Public Sub fillSchedule()
Dim startCol As Long
Dim endCol As Long
Dim i As Long
Dim j As Long

Dim ws As Excel.Worksheet
Dim entryTime As Single
Dim exitTime As Single
Dim formatRange As Excel.Range

Set ws = ActiveSheet

startCol = ws.Range("H:H").Column
endCol = ws.Range("HJ:HJ").Column

Call clearFormats

For i = 2 To ws.Cells(1, 1).End(xlDown).Row
entryTime = ws.Cells(i, 5).Value
exitTime = ws.Cells(i, 6).Value
Set formatRange = Nothing

For j = startCol To endCol
If (ws.Cells(1, j).Value > exitTime) Then
Exit For
End If

If ((entryTime < ws.Cells(1, j).Value) And (ws.Cells(1, j).Value < exitTime)) Then
If (formatRange Is Nothing) Then
Set formatRange = ws.Cells(i, j)
Else
Set formatRange = formatRange.Resize(, formatRange.Columns.Count + 1)
End If
End If
Next j

If (Not formatRange Is Nothing) Then
Call formatTheRange(formatRange, ws.Cells(i, "A").Value)
End If
Next i
End Sub

Private Sub clearFormats()
With ActiveSheet.Range("H2:HJ121")
.clearFormats
.ClearContents
End With

End Sub
Private Sub formatTheRange(ByRef r As Excel.Range, ByRef callsign As String)

r.HorizontalAlignment = xlCenter
r.Merge

r.Value = callsign

" Apply color
With r.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorLight2
.TintAndShade = 0.799981688894314
.PatternTintAndShade = 0
End With

" Apply borders
With r.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With r.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With r.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With r.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
End Sub

0 dla odpowiedzi nr 2

Co powiesz na warunkowe rozwiązanie formatowania?

Zaznacz wszystkie komórki od H2 do (ostatnia prawy dolny cel).

Użyj tej formuły:

=IF(AND((H$1>$E2),(H$1<$F2)),TRUE)

Następnie zastosuj wypełnienie. A jeśli jesteś gotów zrezygnować z granicy i nazwy wewnątrz wypełnionego asortymentu, zadziała ona dla Ciebie :).

Możesz też Zablokować panele z G2, aby można było przewinąć do kolumny HJ i nadal widzieć kolumnę Znaku Połączenia.

Mam nadzieję że to pomoże