应该是VBA中的简单循环过程

时间:2012-03-25 06:42:36

标签: string excel excel-vba vba

在Excel中,我有一列单词。我相信你在编程世界中称之为“字符串”。

逐行,我需要在列中取出每个单词并在其周围放置单个引号。

例如,如果单元格中的单词是dog,我需要将其更改为“dog”。

我正在尝试编写一个宏来执行此操作,但我已经遇到了代码的第一部分问题,这只是将单词列导入来自excel电子表格。

我的代码如下。错误消息显示“下标超出范围”,但正如您所看到的,我已将数组调暗。我究竟做错了什么?感谢。

    Sub putquotes()
    Dim sym(1 To 162) As String
    For i = 1 To 162
       sym(i) = Worksheets("sheet1").Cells(i + 1, 1)
    Next i
    End Sub

3 个答案:

答案 0 :(得分:3)

我认为您的问题是您的sheet1名称,该名称可能应为Sheet1

我会使用第一个工作表(请参阅Set ws = Sheets(1)

请注意,第三张表格为Set ws = Sheets(3),或者如果您确实有这样的表格,则可以使用Set ws = Sheets("Sheet1")

此代码:

  • 将独立于所选的工作表
  • 运行
  • 从A列中的第一个到最后一个使用的单元格查找(而不是硬编码162行)
  • 使用变量数组而不是速度范围
  • 添加一个双''以确保第一个可见:)

    Sub PutQuotes()
    Dim ws As Worksheet
    Dim varList
    Dim rng1 As Range
    Dim lngCnt As Long
    Set ws = Sheets(1)
    Set rng1 = ws.Range(ws.[a1], ws.Cells(Rows.Count, "A").End(xlUp))
    varList = rng1.Value2
    
    For lngCnt = 1 To UBound(varList)
        If Len(varList(lngCnt, 1)) > 0 Then _
            varList(lngCnt, 1) = "''" & varList(lngCnt, 1) & "'"
    Next
    'dump updated array back over range
    rng1.Value2 = varList
    End Sub
    

答案 1 :(得分:2)

您没有名为“Sheet1”的工作表。之一:

  1. 此代码位于工作簿中包含数据的标准模块中,并且您已将其重命名为 表格,或
  2. 代码存在于另一个工作簿中,而您尚未正确限定Worksheets属性
  3. 我将假设后者。当您使用工作表或单元格等集合属性时,Excel会假设父级是谁。标准模块中的不合格工作表调用将采用

    ActiveWorkbook.Worksheets()
    

    ThisWorkbook模块中的不合格的Worksheets调用将采用

    ThisWorkbook.Worksheets()
    

    要查看问题所在,请将此行添加到您的代码中

    Debug.Print Worksheets("Sheet1").Parent.Name
    

    这将告诉您Excel正在使用哪个工作簿,可能与您想要的不同。

    为避免猜错,最好完全限定您的参考资料。例如,如果您使用数据打开工作簿,则可能看起来像这样

    Sub putquotes()
    
        Dim wb As Workbook
        Dim sym(1 To 162) As String
        Dim i As Long
    
        Set wb = Workbooks.Open("Path\Name")
    
        For i = 1 To 162
            sym(i) = wb.Sheets("Sheet1").Cells(i + 1, 1)
        Next i
    
    End Sub
    

    持有wb引用是一种简单的方法来限定引用。如果您没有在代码中打开单独的文件,则可以像

    一样明确限定
    ThisWorkbook.Worksheets("Sheet1")
    ActiveWorkbook.Worksheets("Sheet1")
    Workbooks("Mybook.xlsx").Worksheets("Sheet1")
    

    将单元格值读入数组的更好方法是这样的

    Sub putquotes()
    
        Dim wb As Workbook
        Dim sym As Variant
        Dim i As Long
    
        Set wb = Workbooks.Open("Path\Name")
        sym = wb.Sheets("Sheet1").Range("A2").Resize(162, 1).Value
    
        For i = LBound(sym, 1) To UBound(sym, 1)
            Debug.Print "'" & sym(i, 1) & "'"
        Next i
    
    End Sub
    

    这会给你一个二维基础1数组,你可能不喜欢它,但它比一次读取它们更快。

答案 2 :(得分:1)

我相信你想要这样的东西......

Public Sub DoQuotes()
    Dim iRow As Integer
    Dim Result() As String
    iRow = 1

    Do While Not IsEmpty(Sheet1.Cells(iRow, 1))
        ReDim Preserve Result(iRow - 1)
        Result(iRow - 1) = "'" & Sheet1.Cells(iRow, 1) & "'"
    iRow = iRow + 1
    Loop

    For Each x In Result
        MsgBox (x)
    Next x

End Sub

但是,请记住,Excel会将第一个引用视为文本分隔符,因此当数组中的值为'某事'时,它将在Excel中显示为某些内容。

只是一般的旁观点,尽量避免调用Worksheets()而不是使用强类型的Sheet1对象 - 如果工作表被重命名,可以节省各种未来的痛苦。您可以在vba编辑器中查看“真正”调用的工作表。它会说像Sheet1(MyWorksheet)