Образец данных
Я все еще изучаю VBA, и я понимаю, что основная задача постановки вопроса о потоке стека здесь ясна в процессе цели и мышления.Посмотрим, смогу ли я прояснить суть.
Я сталкиваюсь с файлами с несколькими листами, которые имеют следующие особенности:
- Данные временных рядов, которые могут быть организованы с позициями в строках и годах в столбцах или наоборот, донне имеет фиксированного диапазона.
- Каждый временной ряд может иметь разные имена для одного и того же элемента в разных файлах (например, Revenues, Rev, XYZ Reven и т. Д.).
Я хотел бы создать инструмент, позволяющийпользователь выбирает конкретный временной ряд и сохраняет данные в коллекции или массиве для вычислений (скажем, среднего по временному ряду) в новой рабочей книге.
Первый подход, который я попытался, состоял в том, чтобы адаптировать код, который я нашел изJ.Walkenbackh при отображении файла (https://www.dummies.com/software/microsoft-office/excel/using-vba-to-create-a-worksheet-map/), но я не нашел четкой стратегии для работы с текстовыми ячейками, которые могут также принадлежать числовым данным из-за плохого форматирования исходного файла. Ниже приведена моя частичная попытка получитьЯчейки, которые являются текстовыми файлами.
Я думаю, что я запутался в подходе, который я должен использовать здесь, и я также усложнил вопрос, пытаясь использовать классы для отображения временных рядов со стандартными именами.
Надеюсь, я ясно изложил свою точку зрения и был бы признателен за вашу помощь. Спасибо!
Sub QuickMap()
Dim FormulaCells As Variant
Dim TextCells As Variant
Dim NumberCells As Variant
Dim Area As Range
Dim cel As Range
Dim coll As New Collection
If TypeName(ActiveSheet) <> "Worksheet" Then Exit Sub
' Create object variables for cell subsets
On Error Resume Next
Set FormulaCells = Range("A1").SpecialCells(xlFormulas, xlNumbers + xlTextValues + xlLogical)
Set TextCells = Range("A1").SpecialCells(xlConstants, xlTextValues)
Set NumberCells = Range("A1").SpecialCells(xlConstants, xlNumbers)
On Error GoTo 0
' Add a new sheet and format it
Sheets.Add
With Cells
.ColumnWidth = 2
.Font.Size = 8
.HorizontalAlignment = xlCenter
End With
Application.ScreenUpdating = False
' Do the formula cells
If Not IsEmpty(FormulaCells) Then
For Each Area In FormulaCells.Areas
With ActiveSheet.Range(Area.Address)
.Value = "F"
.Interior.ColorIndex = 3
End With
Next Area
End If
' Do the text cells
If Not IsEmpty(TextCells) Then
For Each Area In TextCells.Areas
With ActiveSheet.Range(Area.Address)
.Value = "T"
.Interior.ColorIndex = 4
End With
Next Area
End If
' Do the numeric cells
If Not IsEmpty(NumberCells) Then
For Each Area In NumberCells.Areas
With ActiveSheet.Range(Area.Address)
.Value = "N"
.Interior.ColorIndex = 6
End With
Next Area
End If
'Check if range is vertical(?)
'Loop through each cell of the area
For Each Area In TextCells.Areas
For Each cel In Area
If cel.Value <> vbNullString Then
coll.Add cel.Value, cel.Address
End If
Next cel
Next Area
b_frmSelect.List1.list = coll
b_frmSelect.Show