VBA-打印空单元格
我的代码从打开文件的两个特定列标题下的中获取信息,并将其打印到主文件中 每隔几个文件就有一列是空的,我需要它将空单元格打印到主文件第2列中第3列的填充单元格范围内。循环会在打印到工作表时查找最后使用的行,因此即使它们为空,也会在上面打印。我想这就是我需要解决的问题。此外,如果有几个占用的单元格后跟许多空单元格,则需要将这两个单元格打印到主文件中 代码说明:VBA-打印空单元格,vba,excel,Vba,Excel,我的代码从打开文件的两个特定列标题下的中获取信息,并将其打印到主文件中 每隔几个文件就有一列是空的,我需要它将空单元格打印到主文件第2列中第3列的填充单元格范围内。循环会在打印到工作表时查找最后使用的行,因此即使它们为空,也会在上面打印。我想这就是我需要解决的问题。此外,如果有几个占用的单元格后跟许多空单元格,则需要将这两个单元格打印到主文件中 代码说明: (4) ... Else 'if no items are under the HOLDER hea
(4)
...
Else
'if no items are under the HOLDER header
StartSht.Range(StartSht.Cells(i, 2), StartSht.Cells(GetLastRowInColumn(StartSht, "C"), 1)) = " "
我的代码根据第3列中的单元格数量将信息打印到主文件的第3列、第2列和第1列。第2列中可以有空白单元格,但第3列中不应出现任何空白单元格第2列和第3列的长度应始终相同(包括空格)
如果一个保持器中根本没有值,短语“empty HOLDER”将打印到第2列(但它只打印一次,我需要它来打印,因为相当于第3列的单元格都是空的。我将该短语更改为“”,但这些单词只是为了帮助我了解程序在做什么
如果在工作表中的任何位置都找不到头文件持有者,则会打印短语“无持有者存在!”
你知道我该怎么解决这个问题吗
它目前看起来像(1),我需要它看起来像(2)
(一)
(二)
完整代码(如果需要)
Option Explicit
Sub LoopThroughDirectory()
Const ROW_HEADER As Long = 10
Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object
Dim dict As Object
Dim MyFolder As String
Dim f As String
Dim StartSht As Worksheet, ws As Worksheet
Dim WB As Workbook
Dim i As Integer
Dim LastRow As Integer, erow As Integer
Dim Height As Integer
Dim FinalRow As Long
Dim hc As Range, hc1 As Range, hc2 As Range, hc3 As Range, hc4 As Range, d As Range
Dim TDS As Range
Dim hc12 As Range, n As Range
Set StartSht = Workbooks("masterfile.xlsm").Sheets("Sheet1")
'turn screen updating off - makes program faster
Application.ScreenUpdating = False
'location of the folder in which the desired TDS files are
MyFolder = "C:\Users\trembos\Documents\TDS\progress\"
'find the headers on the sheet
Set hc1 = HeaderCell(StartSht.Range("B1"), "HOLDER")
Set hc2 = HeaderCell(StartSht.Range("C1"), "CUTTING TOOL")
Set hc4 = HeaderCell(StartSht.Range("A1"), "TOOLING DATA SHEET (TDS):")
'create an instance of the FileSystemObject
Set objFSO = CreateObject("Scripting.FileSystemObject")
'get the folder object
Set objFolder = objFSO.GetFolder(MyFolder)
i = 2
'loop through directory file and print names
'(1)
For Each objFile In objFolder.Files
If LCase(Right(objFile.Name, 3)) = "xls" Or LCase(Left(Right(objFile.Name, 4), 3)) = "xls" Then
'(2)
'Open folder and file name, do not update links
Set WB = Workbooks.Open(FileName:=MyFolder & objFile.Name, UpdateLinks:=0)
Set ws = WB.ActiveSheet
With WB
For Each ws In .Worksheets
'(3)
'find CUTTING TOOL on the source sheet'
If Not ws.Range("A1:M15").Find(What:="CUTTING TOOL", LookAt:=xlWhole, LookIn:=xlValues) Is Nothing Then
Set hc = ws.Range("A1:M15").Find(What:="CUTTING TOOL", LookAt:=xlWhole, LookIn:=xlValues)
Set dict = GetValues(hc.Offset(1, 0), "SplitMe")
If dict.count > 0 Then
'add the values to the master list, column 3
Set d = StartSht.Cells(Rows.count, hc2.Column).End(xlUp).Offset(1, 0)
d.Resize(dict.count, 1).Value = Application.Transpose(dict.items)
Else
'if no items are under the CUTTING TOOL header
StartSht.Cells(Rows.count, hc2.Column).End(xlUp).Offset(1, 0) = " empty TOOL "
End If
Else
StartSht.Cells(Rows.count, hc2.Column).End(xlUp).Offset(1, 0) = "NO CUTTING TOOLS PRESENT"
End If
'(4)
'find HOLDER on the source sheet
If Not ws.Range("A1:M15").Find(What:="HOLDER", LookAt:=xlWhole, LookIn:=xlValues) Is Nothing Then
Set hc3 = ws.Range("A1:M15").Find(What:="HOLDER", LookAt:=xlWhole, LookIn:=xlValues)
Set dict = GetValues(hc3.Offset(1, 0))
If dict.count > 0 Then
'add the values to the master list, column 2
Set d = StartSht.Cells(Rows.count, hc1.Column).End(xlUp).Offset(1, 0)
d.Resize(dict.count, 1).Value = Application.Transpose(dict.items)
Else
'if no items are under the HOLDER header
StartSht.Cells(Rows.count, hc1.Column).End(xlUp).Offset(1, 0) = " empty HOLDER "
End If
Else
'if no HOLDER is found on the sheet
StartSht.Range(StartSht.Cells(i, 2), StartSht.Cells(GetLastRowInColumn(StartSht, "C"), 1)) = "NO HOLDERS PRESENT!"
End If
'(5)
'print the file name to Column 4
StartSht.Cells(i, 4) = objFile.Name
With ws
'Print TDS name by searching for header
If Not ws.Range("A1:K1").Find(What:="TOOLING DATA SHEET (TDS):", LookAt:=xlWhole, LookIn:=xlValues) Is Nothing Then
Set TDS = ws.Range("A1:K1").Find(What:="TOOLING DATA SHEET (TDS):", LookAt:=xlWhole, LookIn:=xlValues).Offset(, 1)
StartSht.Range(StartSht.Cells(i, 1), StartSht.Cells(GetLastRowInColumn(StartSht, "C"), 1)) = TDS
Else
'print the file name wihtout the extension
StartSht.Range(StartSht.Cells(i, 1), StartSht.Cells(GetLastRowInColumn(StartSht, "C"), 1)) = GetFilenameWithoutExtension(objFile.Name)
End If
i = GetLastRowInSheet(StartSht) + 1
End With
Next ws
'(6)
'close, do not save any changes to the opened files
.Close SaveChanges:=False
End With
End If
'(7)
'move to next file
Next objFile
'turn screen updating back on
Application.ScreenUpdating = True
ActiveWindow.ScrollRow = 1 'brings the viewer to the top of the masterfile
End Sub
'(8)
'get all unique column values starting at cell c
Function GetValues(ch As Range, Optional vSplit As Variant) As Scripting.Dictionary
Dim dict As Scripting.Dictionary
Dim dataRange As Range
Dim cell As Range
Dim theValue As String
Dim splitValues As Variant
Set dict = New Scripting.Dictionary
Set dataRange = ch.Parent.Range(ch, ch.Parent.Cells(Rows.count, ch.Column).End(xlUp)).Cells
' If there are no values in this column then return an empty dictionary
' If there are no values in this column, the dataRange will start at the row
' *above* ch and end at ch
If (dataRange.Row = (ch.Row - 1)) And (dataRange.Rows.count = 2) And (Trim(ch.Value) = "") Then
GoTo Exit_Function
End If
For Each cell In dataRange.Cells
theValue = Trim(cell.Value)
If Len(theValue) = 0 Then
theValue = "none"
End If
'exclude any info after ";"
If Not IsMissing(vSplit) Then
splitValues = Split(theValue, ";")
theValue = splitValues(0)
End If
'exclude any info after ","
If Not IsMissing(vSplit) Then
splitValues = Split(theValue, ",")
theValue = splitValues(0)
End If
If Not dict.exists(theValue) Then
dict.Add theValue, theValue
End If
Next cell
Exit_Function:
Set GetValues = dict
End Function
'(9)
'find a header on a row: returns Nothing if not found
Function HeaderCell(rng As Range, sHeader As String) As Range
Dim rv As Range, c As Range
For Each c In rng.Parent.Range(rng, rng.Parent.Cells(rng.Row, Columns.count).End(xlToLeft)).Cells
'copy cell value if it contains some string "holder" or "cutting tool"
If Trim(c.Value) = sHeader Then
'If InStr(c.Value, sHeader) <> 0 Then
Set rv = c
Exit For
End If
Next c
Set HeaderCell = rv
End Function
'(10)
Function GetLastRowInColumn(theWorksheet As Worksheet, col As String)
With theWorksheet
GetLastRowInColumn = .Range(col & .Rows.count).End(xlUp).Row
End With
End Function
'(11)
Function GetLastRowInSheet(theWorksheet As Worksheet)
Dim ret
With theWorksheet
If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
ret = .Cells.Find(What:="*", _
After:=.Range("A1"), _
LookAt:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
Else
ret = 1
End If
End With
GetLastRowInSheet = ret
End Function
'(12)
'get the file name without the extension
Function GetFilenameWithoutExtension(ByVal FileName)
Dim Result, i
Result = FileName
i = InStrRev(FileName, ".")
If (i > 0) Then
Result = Mid(FileName, 1, i - 1)
End If
GetFilenameWithoutExtension = Result
End Function
选项显式
子循环目录()
Const行标题长度=10
作为对象的Dim objFSO
将文件夹变暗为对象
Dim objFile作为对象
作为对象的Dim dict
将MyFolder设置为字符串
作为字符串的Dim f
Dim StartSht作为工作表,ws作为工作表
将WB设置为工作簿
作为整数的Dim i
将最后一行设置为整数,将eRoom设置为整数
变暗高度为整数
暗淡的最后一行
调光hc作为量程,hc1作为量程,hc2作为量程,hc3作为量程,hc4作为量程,d作为量程
变暗TDS As范围
尺寸hc12作为量程,n作为量程
Set StartSht=工作簿(“masterfile.xlsm”).Sheets(“Sheet1”)
'关闭屏幕更新-使程序更快
Application.ScreenUpdating=False
'所需TDS文件所在文件夹的位置
MyFolder=“C:\Users\trembos\Documents\TDS\progress\”
'查找工作表上的标题
设置hc1=头部电池(起始高度范围(“B1”),“支架”)
设定hc2=头槽(起始高度范围(“C1”),“刀具”)
设置hc4=头槽(起始高度范围(“A1”),“工装数据表(TDS):”)
'创建FileSystemObject的实例
设置objFSO=CreateObject(“Scripting.FileSystemObject”)
'获取文件夹对象
设置objFolder=objFSO.GetFolder(MyFolder)
i=2
'循环浏览目录文件并打印名称
'(1)
对于objFolder.Files中的每个objFile
如果LCase(Right(objFile.Name,3))=“xls”或LCase(Left(Right(objFile.Name,4),3))=“xls”,则
'(2)
'打开文件夹和文件名,不更新链接
设置WB=Workbooks.Open(文件名:=MyFolder&objFile.Name,UpdateLinks:=0)
设置ws=WB.ActiveSheet
与WB
对于每个ws-In.工作表
'(3)
“在源工作表上查找刀具”
如果不是ws.Range(“A1:M15”).Find(What:=“CUTTING TOOL”,LookAt:=xlother,LookIn:=xlValues)则为空
设置hc=ws.Range(“A1:M15”).Find(什么:=“切削刀具”,注视:=xlWhole,注视:=xlValues)
Set dict=GetValues(hc.Offset(1,0),“SplitMe”)
如果dict.count>0,则
'将值添加到主列表第3列
Set d=StartSht.Cells(Rows.count,hc2.Column)。End(xlUp)。Offset(1,0)
d、 调整大小(dict.count,1).Value=Application.Transpose(dict.items)
其他的
'如果刀具收割台下没有任何项目
StartSht.Cells(Rows.count,hc2.Column)。End(xlUp)。Offset(1,0)=“空工具”
如果结束
其他的
StartSht.Cells(Rows.count,hc2.Column)。End(xlUp)。Offset(1,0)=“不存在刀具”
如果结束
'(4)
'在源工作表上查找HOLDER
如果不是ws.Range(“A1:M15”).Find(What:=“HOLDER”,LookAt:=xlother,LookIn:=xlValues)则为空
设置hc3=ws.Range(“A1:M15”).Find(What:=“HOLDER”,LookAt:=xlother,LookIn:=xlValues)
Set dict=GetValues(hc3.Offset(1,0))
如果dict.count>0,则
'将值添加到主列表第2列
Set d=StartSht.Cells(Rows.count,hc1.Column)。End(xlUp)。Offset(1,0)
d、 调整大小(dict.count,1).Value=Application.Transpose(dict.items)
其他的
'如果持有人标题下没有项目
StartSht.Cells(Rows.count,hc1.Column)。End(xlUp)。Offset(1,0)=“空保持器”
如果结束
其他的
'如果在图纸上找不到支架
StartSht.Range(StartSht.Cells(i,2),StartSht.Cells(GetLastRowInColumn(StartSht,“C”),1))=“不存在支架!”
如果结束
'(5)
'将文件名打印到第4列
StartSht.Cells(i,4)=objFile.Name
与ws
'通过搜索标题打印TDS名称
如果不是ws.Range(“A1:K1”).Find(What:=“工具数据表(TDS)”,LookAt:=xlother,LookIn:=xlValues)则什么都不是
设置TDS=ws.Range(“A1:K1”).Find(内容:=“工具数据表(TDS)”,LookAt:=xlWhole,LookIn:=xlValues)。偏移量(,1)
StartSht.Range(StartSht.Cells(i,1),StartSht.Cells(GetLastRowInColumn)(StartSht,C)
(4)
...
Else
'if no items are under the HOLDER header
StartSht.Range(StartSht.Cells(i, 2), StartSht.Cells(GetLastRowInColumn(StartSht, "C"), 1)) = " "