/ / Excel VBA - Ako mám vybrať rozsah zodpovedajúci hodnotám v predchádzajúcich bunkách? - excel, vyhľadávanie, excel-vba, výber, vba

Excel VBA - Ako mám vybrať rozsah zodpovedajúci hodnotám v predchádzajúcich bunkách? - excel, vyhľadávanie, excel-vba, výber, vba

Mám veľmi veľký súbor údajov, ktoré zahŕňajú časy začiatku a zastávky pre lietadlá v NAS. Chcem vytvoriť makro na vizualizáciu týchto údajov v programe Excel, ako napríklad:

(poznámka: tento obrázok používa falošné dáta)

Ako vidíte, urobil som prvých 7 riadkovale existuje niekoľko dátových súborov s 2500 + riadkami, z ktorých každý robí proces zdĺhavý. Pokúsil (a) som sa vytvoriť makro, ale som zmätený, ako hľadať a vybrať vhodný rozsah, ktorý chcete zvýrazniť.

Tu je to, čo mám doteraz:

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

Čo je najjednoduchší spôsob výberu riadkov, ktoré potrebujem?

Nie som programátorom podľa profesie, vopred sa ospravedlňujem, ak môj kód preukáže, že nie je technický, alebo porušuje niektoré sväté programovacie princípy.

Vďaka!

odpovede:

1 pre odpoveď č. 1

Tu je môj ísť na VBA za to.

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 pre odpoveď č. 2

A čo podmienené riešenie formátovania?

Zvýraznite všetky bunky od H2 do (posledná spodná pravá bunka).

Použite tento vzorec:

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

Potom použite výplň. A ak ste ochotní vzdať sa hranice a mena vo vnútri plného rozsahu, bude to pre vás pracovať :).

Tiež môžete chcieť zmazať panely z G2, aby ste sa mohli posúvať až na stĺpec HJ a stále vidieť stĺpec Hlasové znaky.

Dúfam, že to pomôže