0

我制作了一个用户表单,允许用户选择一个表并向其中添加行,并用各种信息填充这些行,所有这些都来自用户表单。我遇到了一些问题。

首先在添加项目之后或在添加项目期间(点击提交后)excel会崩溃。它是随机发生的,很难重现。

其次,在运行宏之后,很有可能工作簿中的所有单元格和除用户窗体按钮之外的所有其他对象都将停止工作,这意味着您无法编辑交互甚至选择任何内容。然后当我关闭工作簿时,保存后excel崩溃。这是我的主要罪犯,我认为会导致另一个问题。

是什么导致了这种冻结,为什么会发生?我如何解决它?我环顾四周,没有发现任何间接情况。一篇文章说我应该尝试在没有格式的情况下编辑表格,但我这样做了,但它没有用。

我可以通过 pm 应要求提供 excel 工作簿。

问题用户表单

编码:

激活时 -

Public Sub UserForm_Activate()

    Set cBook = ThisWorkbook
    Set dsheet = cBook.Sheets("DATA")

End Sub

帮助复选框 -

Private Sub cbHelp_Click()

If Me.cbHelp.Value = True Then

    Me.lbHelp.Visible = True

Else

    Me.lbHelp.Visible = False

End If

End Sub

品牌组合框 -

Public Sub cmbBrand_Change()

brandTableName = cmbBrand.Value
brandTableName = CleanBrandTableName(brandTableName)

'if brand_edit is not = to a table name then error is thrown
On Error Resume Next

If Err = 380 Then
    Exit Sub
Else

cmbItemID.RowSource = brandTableName

End If
On Error GoTo 0

'Set cmbItemID's text to nothing after changing to a new brand

cmbItemID.Text = ""


End Sub

CleanBrandTableName(brandTableName) 函数 -

Option Explicit

Public Function CleanBrandTableName(ByVal brandTableName As String) As String

Dim s As Integer
Dim cleanResult As String

For s = 1 To Len(brandTableName)
    Select Case Asc(Mid(brandTableName, s, 1))
        Case 32, 48 To 57, 65 To 90, 97 To 122:
            cleanResult = cleanResult & Mid(brandTableName, s, 1)
        Case 95
            cleanResult = cleanResult & " "
        Case 38
            cleanResult = cleanResult & "and"
    End Select
Next s
CleanBrandTableName = Replace(WorksheetFunction.Trim(cleanResult), " ", "_")

End Function

Public Function CleanSpecHyperlink(ByVal specLink As String) As String

Dim cleanLink As Variant

cleanLink = specLink

cleanLink = Replace(cleanLink, "=HYPERLINK(", "")
cleanLink = Replace(cleanLink, ")", "")
cleanLink = Replace(cleanLink, ",", "")
cleanLink = Replace(cleanLink, """", "")
cleanLink = Replace(cleanLink, "Specs", "")

CleanSpecHyperlink = cleanLink

End Function

浏览按钮 -

Public Sub cbBrowse_Click()

Dim rPos As Long
Dim lPos As Long
Dim dPos As Long

    specLinkFileName = bFile
    rPos = InStrRev(specLinkFileName, "\PDFS\")
    lPos = Len(specLinkFileName)
    dPos = lPos - rPos
    specLinkFileName = Right(specLinkFileName, dPos)
    Me.tbSpecLink.Text = specLinkFileName

End Sub

bFile 函数 -

Option Explicit

Public Function bFile() As String

bFile = Application.GetOpenFilename(Title:="Please choose a file to open")

If bFile = "" Then

    MsgBox "No file selected.", vbExclamation, "Sorry!"

    Exit Function

End If

End Function

预览按钮 -

Private Sub cbSpecs_Click()

If specLinkFileName = "" Then Exit Sub

cBook.FollowHyperlink (specLinkFileName)

End Sub

添加项目按钮 -

Private Sub cbAddItem_Click()

Dim brand As String
Dim description As String
Dim listPrice As Currency
Dim cost As Currency
Dim Notes As String
Dim other As Variant

itemID = Me.tbNewItem.Text
brand = Me.tbBrandName.Text
description = Me.tbDescription.Text
specLink = Replace(specLinkFileName, specLinkFileName, "=HYPERLINK(""" & specLinkFileName & """,""Specs"")")

If Me.tbListPrice.Text = "" Then

    listPrice = 0
Else

    listPrice = Me.tbListPrice.Text

End If

If Me.tbCost.Text = "" Then

    cost = 0

Else

    cost = Me.tbCost.Text

End If

Notes = Me.tbNotes.Text
other = Me.tbOther.Text


If Me.lbItemList.listCount = 0 Then
    x = 0
End If

With Me.lbItemList
    Me.lbItemList.ColumnCount = 8

    .AddItem
    .List(x, 0) = itemID
    .List(x, 1) = brand
    .List(x, 2) = description
    .List(x, 3) = specLink
    .List(x, 4) = listPrice
    .List(x, 5) = cost
    .List(x, 6) = Notes
    .List(x, 7) = other

    x = x + 1

End With

End Sub

提交按钮 -

Private Sub cbSubmit_Click()

Dim n As Long
Dim v As Long
Dim vTable() As Variant
Dim r As Long
Dim o As Long
Dim c As Long
Dim w As Variant

Set brandTable = dsheet.ListObjects(brandTableName)

o = 1

listAmount = lbItemList.listCount

    v = brandTable.ListRows.Count

    w = 0

    For c = 1 To listAmount

        If brandTable.ListRows(v).Range(, 1).Value <> "" Then

        brandTable.ListRows.Add alwaysinsert:=True
        brandTable.ListRows.Add alwaysinsert:=True

        Else

        brandTable.ListRows.Add alwaysinsert:=True
        End If

    Next

    ReDim vTable(1000, 1 To 10)

    For n = 0 To listAmount - 1

        vTable(n + 1, 1) = lbItemList.List(n, 0)
        vTable(n + 1, 2) = lbItemList.List(n, 1)
        vTable(n + 1, 3) = lbItemList.List(n, 2)
        vTable(n + 1, 5) = lbItemList.List(n, 4)
        vTable(n + 1, 6) = lbItemList.List(n, 5)
        vTable(n + 1, 7) = lbItemList.List(n, 6)
        vTable(n + 1, 8) = lbItemList.List(n, 7)

        If lbItemList.List(n, 3) = "" Then

        ElseIf lbItemList.List(n, 3) <> "" Then

            vTable(n + 1, 4) = lbItemList.List(n, 3)

        End If

        If n = 0 And brandTable.DataBodyRange(1, 1) <> "" Then

        For r = 1 To brandTable.ListRows.Count
            If brandTable.DataBodyRange(r, 1) <> "" Then
                o = r + 1
'                brandTable.ListRows.Add alwaysinsert:=True
            End If
        Next
        End If

        brandTable.ListColumns(1).DataBodyRange(n + o).Value = vTable(n + 1, 1)
        brandTable.ListColumns(2).DataBodyRange(n + o).Value = vTable(n + 1, 2)
        brandTable.ListColumns(3).DataBodyRange(n + o).Value = vTable(n + 1, 3)
        brandTable.ListColumns(4).DataBodyRange(n + o).Value = vTable(n + 1, 4)
        brandTable.ListColumns(5).DataBodyRange(n + o).Value = vTable(n + 1, 5)
        brandTable.ListColumns(6).DataBodyRange(n + o).Value = vTable(n + 1, 6)
        brandTable.ListColumns(7).DataBodyRange(n + o).Value = vTable(n + 1, 7)
        brandTable.ListColumns(8).DataBodyRange(n + o).Value = vTable(n + 1, 8)


    Next

    brandTable.DataBodyRange.Select

        Selection.Font.Bold = True
        Selection.WrapText = True

    brandTable.ListColumns(5).DataBodyRange.Select

        Selection.NumberFormat = "$#,##0.00"

    brandTable.ListColumns(6).DataBodyRange.Select

        Selection.NumberFormat = "$#,##0.00"

Unload Me

End Sub

删除项目按钮 -

Private Sub cbRemoveItems_Click()

Dim intCount As Long

For intCount = lbItemList.listCount - 1 To 0 Step -1
     If lbItemList.Selected(intCount) Then
        lbItemList.RemoveItem (intCount)
        x = x - 1
     End If
Next intCount


End Sub

还有其他代码可以为其他选项卡执行操作,但它们不与此选项卡代码交互。

4

0 回答 0