英文:
Need fix for runtime error 1004 in VBA_script
问题
I try to get my hands on VBA-scripts and wrote a script that results in a runtime error 1004
我尝试使用VBA脚本,并编写了一个导致运行时错误1004的脚本。
I wrote a script that should do the following:
- check number of substring in each cell in column A; sheets DATA, whereby substrings are separated by "&"
- if n>1: copy the row n-times below the respective cell; where n is number of substring in a cell
- fill each cell with only one of the substrings
我编写了一个脚本,应该执行以下操作:
- 检查列A中每个单元格中的子字符串数量;工作表为DATA,其中子字符串由"&"分隔
- 如果n>1:复制行n次,位于相应单元格下方;其中n是单元格中的子字符串数量
- 仅用一个子字符串填充每个单元格
According to the Editor I need to debug this following line below the second "&For-Block&":
Sheets(sheetName).Rows(i).Copy Destination:=Sheets(sheetName).Rows(i + 1)
根据编辑器的说法,我需要调试第二个"For-Block"下面的这行代码:
Sheets(sheetName).Rows(i).Copy Destination:=Sheets(sheetName).Rows(i + 1)
However, I don't see an error here.
Could anyone help?
然而,我在这里看不到错误。
有人可以帮忙吗?
英文:
I try to get my hands on VBA-scripts and wrote a script that results in a runtime error 1004
I wrote a script that should do the following:
- check number of substring in each cell in column A; sheets DATA, whereby substrings are seperated by ";"
- if n>1: copy the row n-times below the respective cell; where n is number of substring in a cell
- fill each cell with only one of the substrings
Sub CopyRowsAndFillSubstrings()
Dim lastRow As Long
Dim i As Long, j As Long
Dim substrCount As Long
Dim substrArr() As String
' Specify the sheet name
Dim sheetName As String
sheetName = "Sheet1"
' Define the range of data
lastRow = Sheets(sheetName).Cells(Rows.Count, "A").End(xlUp).Row
' Loop through each row
For i = lastRow To 1 Step -1
substrArr = Split(Sheets(sheetName).Range("A" & i).Value, ";")
substrCount = UBound(substrArr) - LBound(substrArr) + 1
If substrCount > 1 Then
' Copy the row n times, where n is the number of substrings
For j = 2 To substrCount
Sheets(sheetName).Rows(i + 1).Insert Shift:=xlDown
Sheets(sheetName).Rows(i).Copy Destination:=Sheets(sheetName).Rows(i + 1)
Next j
' Fill each cell in the copied rows with one of the substrings
For j = 0 To substrCount - 1
Sheets(sheetName).Cells(i + j, "A").Value = substrArr(j)
Next j
End If
  Next i
End Sub
According to the Editor I need to debug this following line below the second "For-Block":
Sheets(sheetName).Rows(i).Copy Destination:=Sheets(sheetName).Rows(i + 1)
However, I don't see an error here.
Could anyone help?
答案1
得分: 0
以下是您提供的代码的中文翻译:
根据您的需求,有两种解决方案。
Option Explicit
Sub CopyRowsAndFillSubstrings()
Dim lastRow As Long
Dim i As Long, j As Long
'Dim substrCount As Long
Dim substrArr() As String
' 指定工作表名称
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ActiveWorkbook
Set ws = wb.Worksheets("Sheet1")
' 定义数据范围
lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row
' 循环遍历每一行
For i = lastRow To 1 Step -1
substrArr = Split(ws.Range("A" & i).Value, ";")
'substrCount = UBound(substrArr) - LBound(substrArr) + 1
'这与 UBound(substrArr) 相同
'如果您想要替换";"字符串,请运行此代码块
If UBound(substrArr) > 0 Then
' 复制该行 n 次,其中 n 是子字符串的数量
ws.Rows(i + 1 & ":" & i + UBound(substrArr)).Insert shift:=xlDown
For j = 0 To UBound(substrArr)
ws.Cells(i + j, 1) = substrArr(j)
Next j
End If
'或者如果您想要将它们写在";"字符串下方,请运行此代码块
' If UBound(substrArr) > 0 Then
' ' 复制该行 n 次,其中 n 是子字符串的数量
' For j = 0 To UBound(substrArr)
' ws.Rows(i + j + 1).Insert Shift:=xlDown
' ws.Cells(i + j + 1, 1) = substrArr(j)
' Next j
' End If
Next i
End Sub
如果您需要进一步的帮助,请告诉我。
英文:
There are two solutions depending on how you want it.
Option Explicit
Sub CopyRowsAndFillSubstrings()
Dim lastRow As Long
Dim i As Long, j As Long
'Dim substrCount As Long
Dim substrArr() As String
' Specify the sheet name
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ActiveWorkbook
Set ws = wb.Worksheets("Sheet1")
' Define the range of data
lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row
' Loop through each row
For i = lastRow To 1 Step -1
substrArr = Split(ws.Range("A" & i).Value, ";")
'substrCount = UBound(substrArr) - LBound(substrArr) + 1
'It's the same as UBound(substrArr)
'Run this if you want to replace the ";" string
If UBound(substrArr) > 0 Then
' Copy the row n times, where n is the number of substrings
ws.Rows(i + 1 & ":" & i + UBound(substrArr)).Insert shift:=xlDown
For j = 0 To UBound(substrArr)
ws.Cells(i + j, 1) = substrArr(j)
Next j
End If
'Or run this if you want to write them under the ";" string
' If UBound(substrArr) > 0 Then
' ' Copy the row n times, where n is the number of substrings
' For j = 0 To UBound(substrArr)
' ws.Rows(i + j + 1).Insert Shift:=xlDown
' ws.Cells(i + j + 1, 1) = substrArr(j)
' Next j
' End If
Next i
End Sub
答案2
得分: 0
这条消息与您试图通过VBA更改的受保护单元格有关。假设您使用以下命令保护了工作表:
ASHEET.Protect Password:=YOUR_PASS, UserInterfaceOnly:=True, _
AllowFormattingCells:=True, DrawingObjects:=False, Contents:=True
如果您保存工作簿,关闭它,然后重新打开它,当再次打开时,您必须使用相同的命令再次保护工作表,即使尝试使用VBA修改一些受保护的单元格也会出现错误消息。这就好像设置UserInterfaceOnly:=True没有被保存,每次打开工作簿时都需要提醒Excel。
Private Sub Workbook_Open()
Call protectAllSheets
End Sub
Public Sub protectAllSheets()
Dim r As Worksheet
For Each r In ThisWorkbook.Worksheets
r.Protect Password:=YOUR_PASS, _
UserInterfaceOnly:=True, _
AllowFormattingCells:=True, _
DrawingObjects:=False, _
Contents:=True
Next
End Sub
英文:
This message is related to protected cells that you are trying to change through VBA. Suppose you protected the sheet with the command:
ASHEET.Protect Password:=YOUR_PASS, UserInterfaceOnly:=True, _
AllowFormattingCells:=True, DrawingObjects:=False, Contents:=True
If you save the workbook, close it and then open it, YOU HAVE TO PROTECT THE SHEETS AGAIN WHEN OPENING with the same command, even when trying to modify with VBA some protected cells, you will get the error message. It's as if the setting UserInterfaceOnly:=True is not saved and you have to remind excel every time you open the book.
Private Sub Workbook_Open()
Call protectAllSheets
End Sub
Public Sub protectAllSheets()
Dim r As Worksheet
For Each r In ThisWorkbook.Worksheets
r.Protect Password:=YOUR_PASS, _
UserInterfaceOnly:=True, _
AllowFormattingCells:=True, _
DrawingObjects:=False, _
Contents:=True
Next
End Sub
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论