首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要在Excel中执行动态范围

需要在Excel中执行动态范围
EN

Stack Overflow用户
提问于 2021-11-08 04:47:59
回答 1查看 63关注 0票数 1

我的代码出了问题。我做了一个自动计数器,所以每次我点击前进,它计数+1和向后-1。因此,现在根据单元号A2上的数字,我想要执行一个Select.Range函数。

如果A2= 1从B2:H 1000中选择单元格

如果A2 =2,请从I2:O1000中选择单元格,然后继续。

如果我能把一个数学方程放在距离函数上,它就会是:Select.Range("(n*7-5)1:(n*7+1)1000"),n是A2单元值。但是我认为在这个函数中不可能把方程作为变量。

我怎么才能解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-08 09:06:24

引用矩形

  • 调整(播放)常量部分中的值。

标准模块,如

代码语言:javascript
运行
复制
Option Explicit

Sub PrintRectangleAddress()
    
    Const FirstRangeAddress As String = "B2:H1000"
    Const srNum As Long = 2
    Const ByColumn As Boolean = False

    Dim ws As Worksheet: Set ws = ActiveSheet
    Dim frg As Range: Set frg = ws.Range(FirstRangeAddress)

    Dim rg As Range
    Set rg = RefRectangle(frg, srNum, ByColumn)
    
    If rg Is Nothing Then
        Debug.Print "Something went wrong."
        Exit Sub
    End If
    
    Debug.Print rg.Address(0, 0)

End Sub

Sub PrintConsecutiveRectangleAddresses()
    
    Const FirstRangeAddress As String = "B2:H1000" ' "A1:ZZ10000"
    Const ByColumn As Boolean = False ' True
    Const nCount As Long = 40
    
    Dim ws As Worksheet: Set ws = ActiveSheet
    Dim frg As Range: Set frg = ws.Range(FirstRangeAddress)

    Dim rg As Range
    Dim n As Long
    
    For n = 1 To nCount ' Step 3
        Set rg = RefRectangle(frg, n, ByColumn)
        If rg Is Nothing Then
            Debug.Print "Something went wrong."
            Exit Sub
        Else
            Debug.Print rg.Address(0, 0)
        End If
    Next n

End Sub

Function RefRectangle( _
    ByVal FirstRange As Range, _
    ByVal SubRangeIndex As Long, _
    Optional ByVal ByColumn As Boolean = False) _
As Range
    Const ProcTitle As String = "Reference Rectangle"
    
    If FirstRange Is Nothing Then Exit Function
    
    Dim trg As Range
    Dim rCount As Long
    Dim cCount As Long
    
    With FirstRange
        rCount = .Rows.Count
        cCount = .Columns.Count
       ' Exclude top and left
        Set trg = .Resize(.Worksheet.Rows.Count - .Row + 1, _
                .Worksheet.Columns.Count - .Column + 1)
    End With
    'Debug.Print trg.Address
    
    Dim srrCount As Long: srrCount = Int(trg.Rows.Count / rCount)
    Dim srcCount As Long: srcCount = Int(trg.Columns.Count / cCount)
    Dim srMax As Long: srMax = srrCount * srcCount
    'Debug.Print srrCount, srcCount, srMax
    
    If SubRangeIndex > srMax Then
        MsgBox "There is only " & srMax & " ranges.", vbCritical, ProcTitle
        Exit Function '
    End If
    
    Dim srrOffset As Long
    Dim srcOffset As Long
    
    If ByColumn Then
        srrOffset = ((SubRangeIndex - 1) Mod srrCount) * rCount
        srcOffset = Int((SubRangeIndex - 1) / srrCount) * cCount
    Else
        srrOffset = Int((SubRangeIndex - 1) / srcCount) * rCount
        srcOffset = ((SubRangeIndex - 1) Mod srcCount) * cCount
    End If
    'Debug.Print srrOffset, srcOffset
    
    With FirstRange
        Set RefRectangle = .Offset(srrOffset, srcOffset).Resize(rCount, cCount)
    End With
    
End Function

单模块,例如

  • 既然已经使用了代码并了解了它的工作原理,那么您就可以在实际情况下使用该函数了。简化的版本(没有禁用事件和错误处理)如下所示:

代码语言:javascript
运行
复制
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim sCell As Range: Set sCell = Range("A1")
    If Not Intersect(sCell, Target) Is Nothing Then
        If IsNumeric(sCell.Value) Then
            Dim rg As Range
            Set rg = RefRectangle(Range("B2:H1000"), CLng(sCell.Value))
            If Not rg Is Nothing Then
                rg.Select ' or do something more useful
            End If
        End If
    End If
End Sub

  • 现在这是完全自动化的:当您更改A1中的值时,将选择另一个范围。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69878766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档