【问题标题】:How do I store a range of cells in a variable如何将一系列单元格存储在变量中
【发布时间】:2014-05-06 13:43:56
【问题描述】:

我目前正在使用 VBA 将 Sudoku 程序作为 excel 中的一个项目工作,我需要将一系列单元格存储在一个变量中。

类似这样的事情:

'''
dim grid as string 

grid = range("b3:j11")
'''

但我不确定将网格调暗为什么。 我尝试过整数、字符串和范围,但网格似乎从来没有值。 我还假设我没有正确地将范围分配给变量

//////////////////////////////

按照我在此处粘贴代码的回复。 duplicatecheck 函数查看一系列单元格以检查它们是否超过一定数量的一个,然后相应地突出显示单元格

由于我想查看不同范围的单元格以进行不同的检查,因此我需要将范围设为变量,以便可以重复使用该函数

但是,当在 duplicatecheck 函数中调用变量 grid 时,它没有任何值,并且它们的单元格没有被检查

Dim row As Integer

Dim col As Integer

Dim grid As Variant

Dim checkmark As Integer


Sub Rowcheck()

    checkmark = 1
    row = 0
    col = 0

    grid = range("b3:j3").Value

    For row = 0 To 8

        duplicatecheck

    Next row

结束子

Function duplicatecheck()

Dim safe As Boolean

Dim check As Integer

Dim x As Integer

        ' check each number in a range for duplicates starting with 1
For check = 1 To 9
    If Application.Worksheet.Function.CountIf(Selection.Offset(row, col), range(grid)).check = 1      Then 
' if number is only found once
safe = True
    ElseIf Application.Worksheet.Function.CountIf(Selection.Offset(row, col), range(grid)).check < 1 Then
' if the number is found less than once in the range
safe = False
    ElseIf Application.Worksheet.Function.CountIf(Selection.Offset(row, col), range(grid)).check > 1 Then
' if the number is found more than once
Selection.Offset(row, x).range(grid).Interior.colour = vbBlue ' highlight the range red

        If checkmark = 1 Then
              For x = 0 To 8
                    Selection.Offset(row, x).range(geid).Value = check
                    Selection.Offset(row, x).range.ont.colour = vbRed
               Next x
        ElseIf checkmark = 2 Then
              For x = 0 To 8
                    Selection.Offset(x, col).range(grid).Value = check
                    Selection.Offset(x, col).range.ont.colour = vbRed

              Next x
              safe = False
                 error = True

    If safe = False Then
       complete = False
    End If

如果结束 万一 下次检查 结束函数

【问题讨论】:

  • 我已经尝试了这段代码和 Rons,但似乎都没有工作。在网格设置为范围或变体之后运行代码或设置网格 = 范围(“b3:j11”)后,变量网格在稍后调用时仍然没有值
  • 查看我在 Ron 的回答中的评论。变体可以存储范围或值。如果您尝试存储值,请使用范围的值,而不是范围本身。

标签: vba excel


【解决方案1】:

将其存储在变体中

Dim vGrid as Variant
vGrid = range("B3:J11")

vGrid 将是一个基于 1 的二维数组,其中 Dim 1 = 行,Dim2 = 列

例如,B3 的内容将在 vGrid(1,1) 中

编辑:您现在似乎正在使用 Grid 作为 Range 对象的字符串参数,并且您的 CountIF 存在问题。

设置 Option Explicit 和我在评论中提到的要求变量声明的选项。

就您的 CountIF 语句而言,如果您要检查的范围是在 Grid 中声明的范围,并且您的条件在 Selection.Offset(row,col) 中,那么该行应该类似于:

If Application.WorksheetFunction.CountIf(Range(grid),Selection.Offset(Row, col)) = 1 Then ...

请注意,我已更正您将 Function 用作 Worksheet 对象的属性;将范围和条件参数按正确的顺序放置;并删除了您在该函数末尾添加的 .check。

【讨论】:

  • 我将 set grid 设置为变体并运行代码'grid = range("b3:j11")'但是当稍后调用变量 grid 时它仍然没有值跨度>
  • 改用vGrid = Range("B3:J11").Value。这应该存储范围的 而不是范围本身。 存储范围存储范围的值/s在变量中存在巨大差异。
  • @user2920648 如果填充该范围的工作表不是 ActiveSheet,则需要指定工作表。如果这不起作用,请发布更多代码
  • @Nanashi 由于 value 属性是 Range 对象的默认属性,因此将 .Value 添加到 Range 时的行为没有区别。
  • @ShyamSundarShankar 我真的无法从您的评论中准确推断出您想要做什么。可能你需要遍历数组来创建你的文本文件;或者也许还有另一种方式。我建议您尝试一下,编写一些代码,然后,如果它不适合您,请发布一个新问题来说明问题。另请阅读How do I Ask a Good QuestionHow to create a Minimal, Complete, and Verifiable example 的帮助主题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
相关资源
最近更新 更多