Excel vba-多个条件和多个语句
我对VBA编码非常陌生,需要一些帮助。我正在寻找一个代码,它根据不同单元格的值选择范围 在我的工作表中,我有7个单元格,其中有一个公式,如果我希望选择一个范围,则该公式会给单元格一个“X”: 如果I33=“X”,则选择A1:S31(I33有一个公式) 如果I34=“X”,则选择T1:AH31(I33有一个公式) 我有7个 我在寻找什么;如果I33、I34、i35、I36、I37、I38或I39中的一个或多个具有“X”,则应选择相应的区域(例如A1:S31,有7个不同的范围) 谢谢您的帮助:-)您可以试试这个Excel vba-多个条件和多个语句,vba,excel,Vba,Excel,我对VBA编码非常陌生,需要一些帮助。我正在寻找一个代码,它根据不同单元格的值选择范围 在我的工作表中,我有7个单元格,其中有一个公式,如果我希望选择一个范围,则该公式会给单元格一个“X”: 如果I33=“X”,则选择A1:S31(I33有一个公式) 如果I34=“X”,则选择T1:AH31(I33有一个公式) 我有7个 我在寻找什么;如果I33、I34、i35、I36、I37、I38或I39中的一个或多个具有“X”,则应选择相应的区域(例如A1:S31,有7个不同的范围) 谢谢您的帮助:-)您
Option Explicit
Sub main()
Dim xRangeAdress As Range, rangesAddress() As Range, rangeToSelect As Range, cell As Range
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("X-Sheet") '<== change it as per your actual sheet name
Set xRangeAdress = ws.Range("I33:I39") '<== set the range with "X" formulas: change "I33:I39" as per your actual needs
Call SetRangeAddresses(rangesAddress(), ws) ' call the sub you demand the addresses settings to
For Each cell In xRangeAdress 'loop through "X" cells
If UCase(cell.Value) = "X" Then Set rangeToSelect = MyUnion(rangeToSelect, rangesAddress(cell.Row - 33 + 1)) ' if there's an "X" then update 'rangeToSelect' range with corresponding range
Next cell
rangeToSelect.Select
End Sub
Sub SetRangeAddresses(rangeArray() As Range, ws As Worksheet)
ReDim rangeArray(1 To 7) As Range '<== resize the array to as many rows as cells with "X" formula
With ws ' type in as many statements as cells with "X" formula
Set rangeArray(1) = .Range("A1:S31") '<== adjust range #1 as per your actual needs
Set rangeArray(2) = .Range("T1:AH31") '<== adjust range #2 as per your actual needs
Set rangeArray(3) = .Range("AI1:AU31") '<== adjust range #3 as per your actual needs
Set rangeArray(4) = .Range("AU1:BK31") '<== adjust range #4 as per your actual needs
Set rangeArray(5) = .Range("BL1:BT31") '<== adjust range #5 as per your actual needs
Set rangeArray(6) = .Range("BU1:CD31") '<== adjust range #6 as per your actual needs
Set rangeArray(7) = .Range("CE1:CJ31") '<== adjust range #7 as per your actual needs
End With
End Sub
Function MyUnion(rng1 As Range, rng2 As Range) As Range
If rng1 Is Nothing Then
Set MyUnion = rng2
Else
Set MyUnion = Union(rng1, rng2)
End If
End Function
选项显式
副标题()
Dim XRangeAddress作为范围,RangeAddress()作为范围,rangeToSelect作为范围,cell作为范围
将ws设置为工作表
设置ws=ThisWorkbook.Worksheets(“X-Sheet”)”只是为了获得不同的解决方案(关于所需内容,请选择其中一个):
然后通过myRange
执行所有操作。如果您还有任何问题,请提问;) 为什么是VBA?使用公式!我将使用所选范围打印成pdf和邮件。它似乎工作正常:-)。我想我现在可以控制了,但是我如何使用选择并打印到.pdf?如果我的答案符合你的问题,那么请将其标记为已接受。至于“如何打印到pdf”,你必须开始一个新的问题,因为这不适用于“如何选择范围”,这是当前的问题。在开始一个新的问题时,你可能想加上你所有的努力(显示迄今为止为新问题编写的代码),让更多的人可能会帮助你,也让他们的帮助更多effective@user3598756您将option explicit从代码块中删除,我为您重新格式化了它,但它的字符太少,我无法为您进行编辑。
Option Explicit
Function MainFull(Optional WS As Variant) As Range
If VarType(WS) = 0 Then
Set WS = ActiveSheet
ElseIf VarType(WS) <> 9 Then
Set WS = Sheets(WS)
End If
With WS
Dim getRng As Variant, outRng As Range, i As Long
getRng = WS.Range("I33:I39").Value
For i = 1 To 7
If getRng(i, 1) = "x" Then
If MainFull Is Nothing Then
Set MainFull = .Range(Array("A1:S31", "T1:AL31", "AM1:BE31", "BF1:BX31", "BY1:CQ31", "CR1:DJ31", "DK1:EC31")(i - 1)) '<- change it to fit your needs
Else
Set MainFull = Union(MainFull, .Range(Array("A1:S31", "T1:AL31", "AM1:BE31", "BF1:BX31", "BY1:CQ31", "CR1:DJ31", "DK1:EC31")(i - 1))) '<- change it to fit your needs
End If
End If
Next
End With
End Function
Function MainArray(Optional WS As Variant) As Variant
If VarType(WS) = 0 Then
Set WS = ActiveSheet
ElseIf VarType(WS) <> 9 Then
Set WS = Sheets(WS)
End If
With WS
Dim getRng As Variant, outArr() As Variant, i As Long, j As Long
getRng = WS.Range("I33:I39").Value
i = Application.CountIf(WS.Range("I33:I39"), "x")
If i = 0 Then Exit Function
ReDim outArr(1 To i)
For i = 1 To 7
If getRng(i, 1) = "x" Then
j = j + 1
Set outArr(j) = .Range(Array("A1:S31", "T1:AL31", "AM1:BE31", "BF1:BX31", "BY1:CQ31", "CR1:DJ31", "DK1:EC31")(i - 1)) '<- change it to fit your needs
End If
Next
End With
MainArray = outArr
End Function
Dim myRange As Variant
For Each myRange In MainArray("Sheet1")
....
Next