/ / Excel VBA - Як вибрати діапазон, що відповідає значенням у попередніх комірках? - excel, пошук, excel-vba, вибір, vba

Excel VBA - Як вибрати діапазон, що відповідає значенням у попередніх комірках? - excel, пошук, excel-vba, вибір, vba

У мене дуже великий набір даних, що включає час початку та зупинки літака на NAS. Я хочу створити макрос для візуального представлення цих даних у форматі excel, як-от:

(примітка: це зображення використовує фальшиві дані)

Як ви бачите, я зробив перші 7 рядківрука, але існує декілька файлів даних, що містять до 2500 + рядків, кожен з яких робить процес нудним. Я намагався створити макрос, але я розгубився, як шукати і вибрати відповідний діапазон для виділення.

Ось що я маю до цих пір:

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

Який найпростіший спосіб вибрати потрібні рядки?

Я не програміст за професією, заздалегідь вибачте, якщо мій код демонструє неякісну техніку або порушує деякі принципи священного програмування: P

Дякую!

Відповіді:

1 для відповіді № 1

Ось моя іде на 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 для відповіді № 2

Як щодо умовного форматування рішення?

Виділіть усі комірки з H2 (останній нижній правий клітинки).

Використовуйте цю формулу:

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

Потім застосуйте заповнення. І якщо ви бажаєте відмовитися від кордону та назви всередині заповненого діапазону, це буде працювати для вас :).

Крім того, ви можете заморозити панелі з G2, щоб ви могли прокрутити весь шлях до стовпчика HJ і досі бачити колонку Callsign.

Сподіваюся, це допоможе