【问题标题】:Wrap merged cells, delete rows with cells "" Excel VBA包装合并的单元格,删除带有单元格的行“” Excel VBA
【发布时间】:2017-07-14 22:45:41
【问题描述】:

我有两张床单。在第一个上填写所需的信息,另一个基本上是 Sheet(1) 中信息所在的模板。

Sheet(2) 中充满了 =IF(Sheet(1)!A1=””;””;Sheet(1)!A1) 等公式。
所以在 Sheet(2) 上有很多带有“”的值,它们基本上是空白的。如果此行中没有文本,我想删除整行。

所以如果行看起来像:

A33(“”) B33(“”) C33(“”) D33(“”) E33(“”) F33(“”) G33(一些文本) H33(“”) I33(“”) – 它应该留下

A34(“”) B34(“”) C34(“”) D34(“”) E34(“”) F34(“”) G34(“”) H34(“”) I34(“”) – 应该被删除

同样在工作表 (2) 上,我已合并单元格,工作表 (1) 中相应单元格的文本不适合其中。我想将它们在 Sheet(2)!B31:D68(B31:D31 和 B32:D32 等)范围内的这些单元格包装起来。

这是我的代码,但例如合并单元格的 Wrap 不起作用。代码隐藏了我需要删除它们的行。代码还隐藏了带有我在 Sheet(2) 中的文本的行,这些行来自 Sheet(1)。

Sub AutofitRows()
    Dim CL As Range

    For Each CL In ActiveWorkbook.Sheets(2).Range("A30:I68")
        If CL.WrapText Then CL.rows.AutoFit
    Next
End Sub
Sub removecellswithemptycells()
    ActiveWorkbook.Sheets(2).Select
    Set rr = Range("A30:J66")
    For Each cell In rr
    cell.Select
        If cell.HasFormula = True And cell.Value = "" And cell.EntireRow.Hidden = False Then rows(cell.Row).EntireRow.Hidden = True
    Next cell
End Sub
Sub removecellswithemptycells_pos2()
    ActiveWorkbook.Sheets(2).Select
    Set rr = Range("A21:J22")
    For Each cell In rr
    cell.Select
        If cell.HasFormula = True And cell.Value = "" And cell.EntireRow.Hidden = False Then rows(cell.Row).EntireRow.Hidden = True
    Next cell
End Sub
Sub dothefiles()
   Dim NewPath As String
   Dim iFileName$, iRow&
   NewPath = Application.ThisWorkbook.Path & "\" & "Order"
   If Dir(NewPath, 63) = "" Then MkDir NewPath

        ActiveWorkbook.Sheets(2).Select
        ActiveSheet.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=NewPath & "\" & [Sheet(1)!C17] & "-" & [Sheet(1)!C6] & " " & "Order" & " " & [Sheet(1)!C10] & " " & Date & ".pdf", _
        Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, _
        IgnorePrintAreas:=No, _
        OpenAfterPublish:=False

    iFileName = NewPath & "\" & [Sheet(1)!C17] & "-" & [Sheet(1)!C6] & " " & "Order" & " " & [Sheet(1)!C10] & " " & Date & ".xls"

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.Calculation = xlManual

    ThisWorkbook.Sheets(2).Copy
    With ActiveWorkbook.ActiveSheet
         .Buttons.Delete '.Shapes("Button 1").Delete
         .UsedRange.Value = .UsedRange.Value
         For iRow = .Cells(.rows.Count, 2).End(xlUp).Row To 5 Step -1
             If Application.CountA(.rows(iRow)) = 1 Then .rows(iRow).Delete
         Next
         .SaveAs iFileName, xlExcel8: .Parent.Close
    End With

    Application.Calculation = xlAutomatic
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

End Sub
Sub doitallplease()
    Call AutofitRows
    Call removecellswithemptycells
    Call removecellswithemptycells_pos2
    Call dothefiles
End Sub

【问题讨论】:

  • 我认为wrap 标签放错了位置。除此之外,Autofit 不适用于合并单元格,不幸的是,这是一个已知问题。
  • 如果合并单元格的换行是不可能的,我可以“取消合并”它们,但我需要“自动调整”,然后检查我的范围并检查是否需要增加单元格高度。
  • 无效的是Autofit,而不是Wrap。无论如何是你面临的唯一问题吗?如果没有,请先尝试使用未合并的内容,然后在最后进行合并/包装。

标签: vba excel


【解决方案1】:

如果您在启动之前取消合并 Sheet(2) 中的单元格,这应该可以正常工作:

Option Explicit

Public tB As Workbook
Public wS1 As Worksheet
Public wS2 As Worksheet
Public wSCopy As Worksheet

Sub CreateCleanCopies()
    Dim NewPath As String
    Dim iFileName$, iRow&

    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .DisplayAlerts = False
        .Calculation = xlManual
    End With 'Application

    Set tB = ThisWorkbook
    Set wS1 = tB.Sheets(1)
    Set wS2 = tB.Sheets(2)

    NewPath = tB.Path & "\" & "Order"
    iFileName = NewPath & "\" & wS1.Range("C17") & "-" & wS1.Range("C6") & " " & "Order" & " " & wS1.Range("C10") & " " & Date & ".pdf"
    If Dir(NewPath, 63) = vbNullString Then MkDir NewPath

    wS2.Copy
    Set wSCopy = ActiveWorkbook.ActiveSheet

    AutofitRowsAndMerge wSCopy, "A30:I68"

    RemoveEmptyRows wSCopy, "A30:J66"
    RemoveEmptyRows wSCopy, "A21:J22"

    With wSCopy
        .ExportAsFixedFormat _
            Type:=xlTypePDF, _
            FileName:=iFileName, _
            Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, _
            OpenAfterPublish:=False

        iFileName = Replace(iFileName, ".pdf", ".xls")

        .Buttons.Delete
        .UsedRange.Value = .UsedRange.Value


        .Parent.SaveAs iFileName, xlExcel8
        .Parent.Close
    End With

    With Application
        .DisplayAlerts = True
        .Calculation = xlAutomatic
        .EnableEvents = True
        .ScreenUpdating = True
    End With 'Application
End Sub

Sub AutofitRowsAndMerge(wS As Worksheet, RangeAddress As String)
    Dim RgCL As Range
    For Each RgCL In wS.Range(RangeAddress).Columns(1).Cells
        With RgCL
            If Not .WrapText Then .WrapText = True
            .EntireRow.AutoFit
            .Parent.Range(RgCL, .Offset(0, 2)).Merge
        End With 'RgCL
    Next RgCL
End Sub

Sub RemoveEmptyRows(wS As Worksheet, RangeAddress As String)
    Dim RemoveRow As Boolean
    Dim i As Double
    Dim LastRgRow As Double
    Dim FirstRgRow As Double
    Dim RgCL As Range

    With wS.Range(RangeAddress)
        FirstRgRow = .Cells(1, 1).Row
        LastRgRow = .Cells(.Rows.Count, 1).Row
    End With 'wS.Range(RangeAddress)

    For i = LastRgRow To FirstRgRow Step -1
        RemoveRow = True
        For Each RgCL In Application.Intersect(wS.Range(RangeAddress), wS.Rows(i)).Cells
            If RgCL.Value <> vbNullString Then
                RemoveRow = False
                Exit For
            Else
            End If
        Next RgCL
        If RemoveRow Then wS.Rows(i).EntireRow.Delete
    Next i
End Sub

【讨论】:

  • 谢谢它几乎可以工作。我编辑了IgnorePrintAreas:=False, _IgnorePrintAreas:=No, _。现在,当我取消合并单元格时,此宏不会删除空行而是包裹单元格,当我合并单元格时,它不会包裹单元格而是删除空行。如何解决?
  • 我忘了提到如果我在未合并的版本中删除 .Parent.Range(RgCL, .Offset(0, 2)).Merge,Wrap 会起作用。
  • @mrwd :我无法重现这样一个事实,即这可能不会删除空行...您是否签入了保存的 Excel,因为这些行实际上是空的?使用=LEN(A1)检查A1中是否有内容(如果没有则为0)。至于 Wrap,ASH 在 cmets 中对其进行了解释,它不适用于 Merge,因此您必须选择是否要合并并具有太高的行,或者不合并并摆脱列 C 和 D。 ..但我不能为你回答这个问题...
  • 我的错。我不记得我编辑单元格以给出“”而不是“”。你是真正的编程专家!你做了一个巨大的工作!你就像天才一样!我和这个人战斗了两天!万岁 R3uK!
猜你喜欢
  • 2021-05-10
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 2015-08-08
  • 2019-03-28
  • 2021-06-14
相关资源
最近更新 更多