私は 600 個の .txt ファイルを持っていますが、Excel ファイルとして開いた場合にのみ、適切な構造が表示されます。それぞれが 3 つの列と約 18000 行で構成されています。
私の仕事は、それらのそれぞれを開き、C 列の値で降順に並べ替え、最初の 100 を取得し、それらを別のワークシートにコピーし、最初の行を太字にすることでした (新しいワークシートにコピーされた 100 の最初の行)。したがって、最終的な結果は、各ファイルから最大 100 個の値をすべて集めた 1 つのワークシートになり、太字の行で境界線が明確になります。
私はマクロで仕事を成し遂げることにしましたが、VBAプログラミングの経験がないので、ググって多くの問題を抱えていましたが、最終的にいくつかの他のマクロを採用した後(主に試行錯誤の方法で)思いつきました解決。そして、それはうまく機能し、うまくいきました。しかし、問題は、このコードが実際にどのように動作するかを理解していないことです。今は別のことをする必要があり、立ち往生しています。
再び同じ 600 の .txt ファイルから始めます。それぞれを開く必要がありますが、今回はそれらを昇順で並べ替え、平均以上のものだけが残るようにフィルター処理し、最初の 100 行を取得してコピーします。別のワークシートで、最初のものを太字にします。
そして、これを達成する方法がわかりません。私の最大の問題は、フィルタリング後、最初の行が実際には行 1 ではなく、値に依存する他の値であるため、範囲を A2:C101 に指定できないことです。
このタスクを達成するためのアドバイスや解決策をありがとう。
編集して自分自身を明確にします:主な問題は、データをフィルタリングするときに最初の100行を取得する方法がわからないことです。これは、フィルタリング後の行数(Excelラベル)が1、2、3のソート後のようではないためです。値についてたとえば、5,6,8,21のようなものを取得できます...だから私の質問は、この範囲を取る方法ですか?
そして、最初のタスクで機能するコードは次のとおりです(面倒だとは思いますが、できる限り最善です):
Sub MergeAllWorkbooks()
Dim MyPath As String, FilesInPath As String
Dim MyFiles() As String
Dim SourceRcount As Long, FNum As Long
Dim mybook As Workbook, BaseWks As Worksheet
Dim sourceRange As Range, destrange As Range
Dim rnum As Long, CalcMode As Long
Dim isEmpty As String
isEmpty = "null"
' Change this to the path\folder location of your files.
MyPath = "C:\Excel"
' Add a slash at the end of the path if needed.
If Right(MyPath, 1) <> "\" Then
MyPath = MyPath & "\"
End If
' If there are no Excel files in the folder, exit.
FilesInPath = Dir(MyPath & "*.txt")
If FilesInPath = "" Then
MsgBox "No files found"
Exit Sub
End If
' Fill the myFiles array with the list of Excel files
' in the search folder.
FNum = 0
Do While FilesInPath <> ""
FNum = FNum + 1
ReDim Preserve MyFiles(1 To FNum)
MyFiles(FNum) = FilesInPath
FilesInPath = Dir()
Loop
' Set various application properties.
' With Application
' CalcMode = .Calculation
' .Calculation = xlCalculationManual
' .ScreenUpdating = False
' .EnableEvents = False
' End With
' Add a new workbook with one sheet.
Set BaseWks = Workbooks.Add(xlWBATWorksheet).Worksheets(1)
rnum = 1
' Loop through all files in the myFiles array.
If FNum > 0 Then
For FNum = LBound(MyFiles) To UBound(MyFiles)
Set mybook = Nothing
On Error Resume Next
Set mybook = Workbooks.Open(MyPath & MyFiles(FNum))
On Error GoTo 0
Dim c As Range
Dim SrchRng As Range
Dim SrchStr As String
SrchStr = "null"
Set SrchRng = mybook.Worksheets(1).Range("C1:C18000")
Do
Set c = SrchRng.Find(SrchStr, LookIn:=xlValues)
If Not c Is Nothing Then c.EntireRow.Delete
Loop While Not c Is Nothing
If Not mybook Is Nothing Then
On Error Resume Next
mybook.Worksheets(1).Sort.SortFields.Clear
mybook.Worksheets(1).Sort.SortFields.Add Key:=Range("C1:C18000") _
, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
' Change this range to fit your own needs.
With mybook.Worksheets(1)
Set sourceRange = .Range("A2:C101")
End With
If Err.Number > 0 Then
Err.Clear
Set sourceRange = Nothing
Else
' If source range uses all columns then
' skip this file.
If sourceRange.Columns.Count >= BaseWks.Columns.Count Then
Set sourceRange = Nothing
End If
End If
On Error GoTo 0
If Not sourceRange Is Nothing Then
SourceRcount = sourceRange.Rows.Count
If rnum + SourceRcount >= BaseWks.Rows.Count Then
MsgBox "There are not enough rows in the target worksheet."
BaseWks.Columns.AutoFit
mybook.Close savechanges:=False
GoTo ExitTheSub
Else
' Copy the file name in column A.
' With sourceRange
' BaseWks.Cells(rnum, "D").Font.Bold = True
' BaseWks.Cells(rnum, "D"). _
Resize(.Rows.Count).Value = MyFiles(FNum)
' End With
' Set the destination range.
Set destrange = BaseWks.Range("A" & rnum)
With mybook.Worksheets(1).Sort
.SetRange Range("A1:C18000")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
' Copy the values from the source range
' to the destination range.
With sourceRange
BaseWks.Cells(rnum, "A").Font.Bold = True
BaseWks.Cells(rnum, "B").Font.Bold = True
BaseWks.Cells(rnum, "C").Font.Bold = True
'MsgBox (BaseWks.Cells.Address)
If ActiveCell.Text = isEmpty Then
ActiveCell.Offset(0, 1) = 1
ActiveCell.Offset(1).EntireRow.Insert
ActiveCell.Offset(1, 1) = 0
End If
Set destrange = destrange. _
Resize(.Rows.Count, .Columns.Count)
End With
destrange.Value = sourceRange.Value
rnum = rnum + SourceRcount
End If
End If
mybook.Close savechanges:=False
End If
Next FNum
BaseWks.Columns.AutoFit
End If
ExitTheSub:
' Restore the application properties.
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = CalcMode
End With
End Sub