根据列A中的单元格值设置整个行的值?

这是我想要达到的,我在A3:A5002有一个带有项目编号的Excel工作表,以及有关B:FHB:FH项目的各种信息。 随着项目的中断,表单的长度发生变化。 我遇到的问题是工作表中包含很多公式,数据validation列表以及现有的VBA代码,当从表中删除行时会出现乱码。 我希望创build的子将查看空白单元格的项目编号范围,然后将整个行重新设置为起始值(请参阅下面的代码)。 然后,我想能够将这些空白单元格sorting到工作表的底部。

下面的代码可以重置整个工作表。 您将能够在此代码中看到工作表中发现的三个不同的起始值以及每个单元格的范围。 有人可以帮我改变这个代码,只重置在项目编号范围A3:A5002没有值的A3:A5002吗?

 Option Explicit Option Compare Text Private WS As Worksheet Private WSRange As Range Private BlankRng As Range Private SelRng As Range Private TypRng As Range Sub ResetSheet() 'when I tried to brake the set line up using " _" to make it easier to read, it errors out. Set BlankRng = WS.Range("A3:A5002,T3:T5002,W3:W5002,Y3:AA5002,AC3:AF5002,AI3:AM5002,AO3:AR5002,BA3:BO5002,CF3:CH5002,CK3:CK5002,CM3:CU5002,CW3:CX5002,DF3:DF5002,DU3:DU5002") Set SelRng = WS.Range("B3:B5002,U3:V5002,AH3:AH5002,AN3:AN5002,AS3:AU5002,CI3:CJ5002,CL3:CL5002,CV3:CV5002,CY3:DE5002") Set TypRng = WS.Range("S3:S5002") BlankRng.Value = "" SelRng.Value = " --Select--" TypRng.Value = "Type" End Sub 

我想知道,是否有可能创build一个名为“ResetRow”,然后我可以这样使用的函数(下面的代码只是一个猜测)

 Sub Idea() Dim ITEM as range Set ITEM = range("A3:A5002") For each cell in ITEM If Not ActiveCell.Value = "" Then ActiveCell.EntireRow.ResetRow Next Cell 

没有For循环:

 Option Explicit Sub ResetSheet() Const USED_RANGE As String = "A2:FH5002" Const BLANKS_COLS As String = "A2:A5002,T2:T5002,W2:W5002,Y2:AA5002,AC2:AF5002,AI2:AM5002,AO2:AR5002,BA2:BO5002,CF2:CH5002,CK2:CK5002,CM2:CU5002,CW2:CX5002,DF2:DF5002,DU2:DU5002" Const SELECT_COLS As String = "B2:B5002,U2:V5002,AH2:AH5002,AN2:AN5002,AS2:AU5002,CI2:CJ5002,CL2:CL5002,CV2:CV5002,CY2:DE5002" Const TYPES_COLS As String = "S2:S5002" Const BLANKS_VAL As String = vbNullString Const SELECTS_VAL As String = " --Select--" Const TYPES_VAL As String = "Type" Dim ws As Worksheet, ur As Range Set ws = ActiveSheet Set ur = ws.Range(USED_RANGE) Application.ScreenUpdating = False With ur .AutoFilter Field:=1, Criteria1:="=" If .SpecialCells(xlCellTypeVisible).Count > 1 Then .Range(BLANKS_COLS).Value2 = BLANKS_VAL .Range(SELECT_COLS).Value2 = SELECTS_VAL .Range(TYPES_COLS).Value2 = TYPES_VAL End If .AutoFilter End With ws.Cells(5003, 1).EntireRow.Delete Application.ScreenUpdating = True End Sub 

我赞成你的简单的ResetRow函数,因为它更容易维护。 你设置范围的方式可能容易出错(至less对我来说),所以我的实现试图使它更简单一些。

编辑:传递工作表对象到重置例程保证哪些工作表的目标。

 Option Explicit Sub test() Dim ws As Worksheet Dim lastrow As Long Dim i As Long '--- disable updates to run much quicker Application.EnableEvents = False Application.ScreenUpdating = False Set ws = ActiveSheet lastrow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row For i = 3 To lastrow If ws.Cells(i, 1) = "" Then ResetRow ws, i End If Next i Application.EnableEvents = True Application.ScreenUpdating = True End Sub Sub ResetRow(ws As Worksheet, rowNumber As Long) Dim blankCols() As String Dim selCols() As String Dim typCols() As String Dim vc As Variant Dim lc As Long '--- initialize which columns get which setting (INCOMPLETE!! set this up correctly for your sheet) blankCols = Split("A,T,Y,Z,AA,AC,AD,AE,AF,AI,AJ,AK,AL,AM", ",", , vbTextCompare) selCols = Split("B,U,V,AH,AN,AS,CI,CJ,CL,CV", ",", , vbTextCompare) typCols = Split("S", ",", , vbTextCompare) '--- reset each field to the default setting For Each vc In blankCols lc = ws.Range(vc & 1).Column ws.Cells(rowNumber, lc).Value = "" Next vc For Each vc In selCols lc = ws.Range(vc & 1).Column ws.Cells(rowNumber, lc).Value = "-- Select --" Next vc For Each vc In typCols lc = ws.Range(vc & 1).Column ws.Cells(rowNumber, lc).Value = "Type" Next vc End Sub