【问题标题】:Set all cells in a table column to a specific value将表格列中的所有单元格设置为特定值
【发布时间】:2013-07-10 15:37:22
【问题描述】:

我目前正在处理一个带有标题的表格格式的数据集。我需要做的是循环浏览特定列中的所有单元格并更改内容。通过对 MSDN 的研究,我想出了以下 for 循环

for i = 1 to NumRows
    Cells(i,23).Value = "PHEV"
next i

因此,这会将第 23 列中的所有单元格更改为“PHEV”。但是,我自己并没有构建我正在使用的表,所以我不能保证我感兴趣的列是第 23 列。

我想实现类似于以下内容:

for i = 1 to NumRows
    Cells(i,[@[columnHeader]]).Value = "PHEV"
next i

当然,我知道那个语法是不正确的,但希望它足以说明我的目标。

【问题讨论】:

    标签: vba excel excel-2010


    【解决方案1】:

    如果这实际上是一个ListObject 表(从功能区插入表),那么您可以使用该表的.DataBodyRange 对象来获取行数和列数。这会忽略标题行。

    Sub TableTest()
    
    Dim tbl As ListObject
    Dim tRows As Long
    Dim tCols As Long
    
    Set tbl = ActiveSheet.ListObjects("Table1")  '## modify to your table name.
    
    With tbl.DataBodyRange
        tRows = .Rows.Count
        tCols = .Columns.Count
    End With
    
    MsgBox tbl.Name & " contains " & tRows & " rows and " & tCols & " columns.", vbInformation
    
    End Sub
    

    如果您需要使用标题行,而不是使用tbl.DataBodyRange,只需使用tbl.Range

    【讨论】:

    • 应该看起来像:tCols = .Columns.Count... 我认为最干净的解决方案
    • 使用此代码循环和引用表格单元格的适当方法是什么?
    • @ScottBeeson 你可以遍历tbl.DataBodyRange.Cells 集合,或者通过索引:tbl.DataBodyRange(1, 1)
    • 那么喜欢For i = 1 To tbl.ListRows.Count tbl.Range("G" & i).value = "test"?
    • 我会做For i = 1 To tbl.ListRows.Count : tbl.ListRows(i, 7).Value = "test"(假设您想要表格中的第七列,无论 letter 列恰好是什么,否则,根据需要进行修改)。 @ScottBeeson 否则,如果您在实施时遇到困难,请提出您自己的新问题。干杯。
    【解决方案2】:

    假设您的表名为“Table1”,而您需要的列是“Column”,您可以试试这个:

    for i = 1 to Range("Table1").Rows.Count
       Range("Table1[Column]")(i)="PHEV"
    next i
    

    【讨论】:

    • 谢谢!非常简单和优雅的问题解决方案,为我节省了一堆编码和其他更复杂的解决方案。
    • 典型答案。应该是接受/最高的投票(如果用户以后继续注意到它,预计它会随着时间的推移而消失)。比其他网站上蹩脚的弯路答案让我接受的要好得多。
    • 想知道您是否正在处理一个非常大的表,如果检索列一次然后从该列开始工作,而不是继续使用范围,是否会更有效一点。所以额外的行......看起来它是 for 循环之前的 myColumn = Range("Table1[Column]") (并且为了很好的衡量像 dim myColumn as Variant 之类的东西???看起来报告为某种数组? 或者有没有更精确的数据类型我错过了?)...然后在代码中 myColumn(i) = "PHEV"。但在很多情况下它可能并不重要?
    【解决方案3】:

    假设您的表名为“Table1”,而您的列名为“Column1”,则:

    For i = 1 To ListObjects("Table1").ListRows.Count
        ListObjects("Table1").ListColumns("Column1").DataBodyRange(i) = "PHEV"
    Next i
    

    【讨论】:

      【解决方案4】:

      您可以在作业前搜索列:

      Dim col_n as long
      for i = 1 to NumCols
          if Cells(1, i).Value = "column header you are looking for" Then col_n = i
      next
      
      for i = 1 to NumRows
          Cells(i, col_n).Value = "PHEV"
      next i
      

      【讨论】:

      • 第 3 行,你有一个逗号而不是一个点来访问单元格的值。
      • 好答案。我希望 Excel 更具语义...为什么我不能像 python 或 JSON 中的字典一样引用 table["column name"] 之类的列?它与其他表操作类似,例如引用同一行中的其他列值。
      • @grisaitis 因为那太明智了。微软喜欢混乱。
      【解决方案5】:

      如果您知道标题名称,则可以根据该名称找到列:

      Option Explicit
      
      Public Sub changeData()
          Application.ScreenUpdating = False ' faster for modifying values on sheet
      
          Dim header As String
          Dim numRows As Long
          Dim col As Long
          Dim c As Excel.Range
      
          header = "this one" ' header name to find
      
          Set c = ActiveSheet.Range("1:1").Find(header, LookIn:=xlValues)
          If Not c Is Nothing Then
              col = c.Column
          Else
              ' can't work with it
              Exit Sub
          End If
      
          numRows = 50 ' (whatever this is in your code)
      
          With ActiveSheet
              .Range(.Cells(2, col), .Cells(numRows, col)).Value = "PHEV"
          End With
      
          Application.ScreenUpdating = True ' reset
      End Sub
      

      【讨论】:

      • +1。如果要将列中的所有单元格设置为一个值,则绝对没有理由循环遍历该范围来这样做。只需将范围设置为您想要的值,就像@joseph4th 在这里所做的那样。我还会声明一个工作表对象,这样您就不需要使用 ActiveSheet。
      【解决方案6】:

      我遇到了同样的问题,但没有论坛可以帮助我,几分钟后我想出了一个主意:

      match(ColumnHeader,Table1[#Headers],0)
      

      这将返回您的号码。

      【讨论】:

        【解决方案7】:

        您可以通过只知道其名称而不是其位置来遍历表格中任何列的单元格。如果表格在工作簿的 sheet1 中:

        Dim rngCol as Range
        Dim cl as Range
        Set rngCol = Sheet1.Range("TableName[ColumnName]")
        For Each cl in rngCol
            cl.Value = "PHEV"
        Next cl
        

        上面的代码将仅循环遍历数据值,不包括标题行和总计行。不需要指定表格的行数。

        使用它通过列名查找表中任何列的位置:

        Dim colNum as Long
        colNum = Range("TableName[Column name to search for]").Column
        

        这将返回表格中列的数字位置。

        【讨论】:

          【解决方案8】:

          您可以找到表格的最后一列,然后通过循环填充单元格。

          Sub test()
              Dim lastCol As Long, i As Integer
              lastCol = Range("AZ1").End(xlToLeft).Column
                  For i = 1 To lastCol
                      Cells(1, i).Value = "PHEV"
                  Next
          End Sub
          

          【讨论】:

            【解决方案9】:

            由于上述答案都没有帮助我解决我的问题,因此我的解决方案是从每一行中提取某个(命名的)列。

            使用一些命名列的值将表格转换为文本YesNoMaybe)在选项卡myTable 上的命名 Excel 表格 myTable 中使用以下(Excel)VBA sn-p:

            Function Table2text()
                Dim NumRows, i As Integer
                Dim rngTab As Range
                Set rngTab = ThisWorkbook.Worksheets("mySheet").Range("myTable")
                ' For each row, convert the named columns into an enumeration
                For i = 1 To rngTab.Rows.Count
                    Table2text= Table2text & "- Yes:"   & Range("myTable[Yes]")(i).Value & Chr(10)
                    Table2text= Table2text & "- No: "   & Range("myTable[No]")(i).Value & Chr(10)
                    Table2text= Table2text & "- Maybe: "& Range("myTable[Maybe]")(i).Value & Chr(10) & Chr(10)
                Next i
              ' Finalize return value 
              Table2text = Table2text & Chr(10)  
            End Function
            

            我们定义了一个循环范围rngTab。诀窍是使用Range("myTable[col]")(i) 提取行i 中列col 的条目。

            【讨论】:

              【解决方案10】:

              我修改了一点 SnitkaSirk 的answer。这是遍历 listobject 单元格的简单方法,例如在列中:

              Dim cell As Range
              For Each cell In ListObjects("NameOfTable").ListColumns("HeaderNameOfColumn").DataBodyRange
                  Debug.Print x
              Next
              

              【讨论】:

                猜你喜欢
                • 2014-05-30
                • 2014-09-24
                • 2022-01-07
                • 2022-06-29
                • 1970-01-01
                • 1970-01-01
                • 2014-12-28
                • 1970-01-01
                • 2020-01-27
                相关资源
                最近更新 更多