【发布时间】:2018-09-16 06:53:12
【问题描述】:
我已经在下面的代码上工作了一段时间,我几乎完成了。它从一张表中获取 3 个单元格的数据,将其复制到另一张表中,根据第一张表中的名称保存副本,然后循环直到完成所有填充的行。
我遇到的问题是,当第一个循环完成并且它需要选择保存数据的WB(该功能需要选择)时,由于@ 中的错误而无法选择它987654322@。当我调试时,切换到WB 并运行它确实可以工作的代码。
这可能是我想念的愚蠢的东西。感谢您的帮助!
Sub motivatieFormOpmaken()
Dim wbMotivTemp As Workbook
Dim wsMotiv As Worksheet
Dim PathOnly, mot, FileOnly As String
Dim StrPadSourcenaam As String
Dim WsStam As Worksheet
Dim WbStam As Workbook
Dim LastRow As Long
Set wbMotivTemp = ThisWorkbook
Set wsMotiv = ActiveSheet
StrHoofdDocument = ActiveWorkbook.Name
StrPadHoofdDocument = ActiveWorkbook.Path
StrPadSourcenaam = StrPadHoofdDocument & "\" & c_SourceDump
If Not FileThere(StrPadSourcenaam) Then
MsgBox "Document " & StrPadSourcenaam & " is niet gevonden."
Exit Sub
End If
Application.ScreenUpdating = False
Workbooks.Open FileName:=StrPadSourcenaam
Set WbStam = ActiveWorkbook
Set WsStam = WbStam.Worksheets("Stambestand")
Application.Run "Stambestand.xlsm!unhiderowsandcolumns"
Worksheets("stambestand").Activate
iLaatsteKolom = Worksheets("stambestand").Cells.SpecialCells(xlLastCell).Column
iLaatsteRij = Worksheets("stambestand").Cells.SpecialCells(xlLastCell).row
VulKolomNr
If KolomControle = False Then Exit Sub
Cells(1, iKolomnrVerwijderen_uit_de_tellingen).AutoFilter Field:=iKolomnrVerwijderen_uit_de_tellingen, Criteria1:="0"
LastRow = Cells(1, iKolomnrCorpID).End(xlDown).row
Dim row As Long
row = 2
With WsStam
Do Until row > iLaatsteRij
If .Cells(row, iKolomnrCorpID).RowHeight > 0 Then
WsStam.Cells(row, iKolomnrCorpID).EntireRow.Select 'It crashes at this line, after the first loop
wsMotiv.Range("motiv_cid") = Cells(row, iKolomnrCorpID).Text
wsMotiv.Range("motiv_naam") = Cells(row, iKolomnrNaam).Text
wsMotiv.Range("motiv_ldg") = Cells(row, iKolomnrHuidigeLeidingGevende).Text
n = naamOpmaken
wbMotivTemp.Activate
ActiveWorkbook.SaveAs FileName:=StrPadHoofdDocument & "\Docs\" & n & ".xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
End If
row = row + 1
Loop
End With
End Sub
Function naamOpmaken() As String
Dim rng As Range
Dim row As Range
Set rng = Selection.SpecialCells(xlCellTypeVisible)
iRijnummer = rng.row
If iRijnummer > 1 Then
naam = Cells(iRijnummer, iKolomnrNaam).Text
ldg = Cells(iRijnummer, iKolomnrHuidigeLeidingGevende).Text
cid = Cells(iRijnummer, iKolomnrCorpID).Text
Dim Position As Long, Length As Long
Dim n As String
Position = InStrRev(naam, " ")
Length = Len(naam)
n = Right(naam, Length - Position)
End If
naamOpmaken = n + "-" + ldg + "-" + cid
End Function
【问题讨论】:
-
几点-与您遇到的问题无关。
Dim PathOnly, mot, FileOnly As String- 只有FileOnly是一个字符串,PathOnly和mot是Variants。使用Dim PathOnly As String, mot AS String, FileOnly As String。LastRow = Cells(1, iKolomnrCorpID).End(xlDown).row在空白纸上,或者在 A1 中只有一个值的纸上,这将返回 1048576。请改用Cells(rows.Count, 1).End(xlup).row。Cells(iRijnummer, iKolomnrCorpID).Text- 使单元格太薄而无法显示值,这将返回######使用.Value而不是.Text。 -
1.当我将其设为值而不是文本时,该函数不再构成文档。它尝试将值输入到字符串中。
-
2.您的意思是不要将变量作为变体的
Dim?这是做什么的?关于行的问题。它绝不是一张白纸,总是有相同的起始列,至少有两行。 -
单元格中的值是多少?如果它是数字或日期,那么您可以使用
FORMAT将其更改为正确的字符串 -FORMAT(Cells(iRijnummer, iKolomnrHuidigeLeidingGevende),"dd-mmm-yyyy")将返回06-Apr-2018作为今天的日期。FORMAT(Cells(iRijnummer, iKolomnrHuidigeLeidingGevende),"0000")将确保数字长度为四个字符 - 例如0001。 NB:值是单元格的默认属性,所以不必显式添加.Value -
不确定
You mean to not put the variable as a Dim for the variants?的意思你应该明确说明每个变量使用哪种数据类型,否则它们默认为变量。这并不总是一个问题,我正在努力想一个现在是什么时候的例子......