/ / Excel VBA - 以前のセルの値に対応する範囲を選択するにはどうすればよいですか? - excel、search、excel-vba、selection、vba

Excel VBA - 以前のセルの値に対応する範囲を選択するにはどうすればよいですか? - excel、search、excel-vba、selection、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

私は必要な行を選択する最も簡単な方法は何ですか?

私は職業によってプログラマーではなく、私のコードが巧妙な技術を示していたり​​、いくつかの聖なるプログラミング原則に違反している場合は、事前に謝罪しています。

ありがとう!

回答:

回答№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

回答№2の場合は0

条件付き書式設定ソリューションはどうですか?

H2から(最後の右下のセル)にすべてのセルをハイライトします。

次の数式を使用します。

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

次に塗りつぶしを適用します。そして、もしあなたが "国境を越えて喜んで、満たされた範囲の中に名前を残すなら、それはあなたのために働くでしょう:)。

また、G2からペインをフリーズすると、HJ列までスクロールしてもCallsign列が表示されることがあります。

お役に立てれば