在Excel中,我有一列单词。我相信你在编程世界中称之为“字符串”。
逐行,我需要在列中取出每个单词并在其周围放置单个引号。
例如,如果单元格中的单词是dog,我需要将其更改为“dog”。
我正在尝试编写一个宏来执行此操作,但我已经遇到了vba代码的第一部分问题,这只是将单词列导入vba来自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
答案 0 :(得分:3)
我认为您的问题是您的sheet1
名称,该名称可能应为Sheet1
我会使用第一个工作表(请参阅Set ws = Sheets(1)
)
请注意,第三张表格为Set ws = Sheets(3)
,或者如果您确实有这样的表格,则可以使用Set ws = Sheets("Sheet1")
此代码:
添加一个双''
以确保第一个可见:)
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”的工作表。之一:
我将假设后者。当您使用工作表或单元格等集合属性时,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)