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

在Excel中,我有一列文字。 我相信你在编程世界中称为“string”。

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

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

我试图写一个macros来做到这一点,但是我已经遇到了vba代码的第一部分的问题,这只是从Excel电子表格中将字段列导入到vba中 。

我的代码如下。 错误消息说“下标超出范围”,但正如你所看到的,我黯淡了arrays。 我究竟做错了什么? 谢谢。

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 

我认为你的问题是您的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 

您没有名为“Sheet1”的工作表。 或者:

  1. 此代码与工作簿中的数据一起存在于标准模块中,并已重命名工作表或
  2. 该代码位于另一个工作簿中,并且您没有正确限定您的Worksheets属性

我将假设后者。 当您使用工作表或单元格等集合属性时,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 

保持该参考是一个简单的方法来限定参考。 如果你没有在代码中打开一个单独的文件,你可以显式地限定

 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的数组,但你可能不喜欢,但是比一次只读一个数组要快。

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

 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中,数组中的值是'something',它看起来像是某个东西。

只是一个普通的旁观点,尽量避免调用Worksheets(),而不是使用强types的Sheet1对象 – 如果工作表被重命名,可以保存各种未来的痛苦。 你可以看到在vba编辑器中“真正”调用的表单。 它会像Sheet1(MyWorksheet)