Board logo

標題: [發問] 執行階段錯誤'380' [打印本頁]

作者: wang077    時間: 2021-7-27 15:42     標題: 執行階段錯誤'380'

各位大神,我在做一個查詢系統
當我選擇sheet2然後用combobox2篩選完後
想要讓某幾個欄位直接在listbox上顯示,所以有了簡易查看的按鈕
但是抓到AJ欄時,卻一直顯示[執行階段錯誤'380']
請問有哪�媦g錯嗎?
[attach]33769[/attach]
作者: wang077    時間: 2021-7-29 10:04

回復 1# wang077
有大神幫幫忙嗎
還是是我解釋的不清楚?
我做了一個查詢系統在uesrform1
選完班別後按確定
然後選機種
選完機種後按簡易查看
問題就是最後的數值無法顯示在listbox上
作者: singo1232001    時間: 2021-7-29 10:45

本帖最後由 singo1232001 於 2021-7-29 10:47 編輯

回復 2# wang077
作者: wang077    時間: 2021-7-29 11:40

回復 3# singo1232001
大大,請問我那樣寫為何抓取不到?
另外如果改成這樣,我在簡易查詢的時候,有辦法只抓取到入庫、良品、良率這三行的資料嗎
然後前面A、B欄在簡易查詢時不要重複
[attach]33781[/attach]
作者: singo1232001    時間: 2021-7-29 12:46

本帖最後由 singo1232001 於 2021-7-29 13:00 編輯

回復 4# wang077

http://forum.twbts.com/thread-23251-1-2.html
之前的規則 主要我整理了兩種匯入方式
這次你的問題 剛好在我沒寫到的範圍外 當時也沒問題就沒花時間深入摸索

目前你所使用的是屬於additem的"陣列一次匯入"方式
(雖然沒出現additem)
但直接用陣列匯入 也算此類

原因在於個別 additem 無法超過10欄位
只能靠陣列匯入 才能超過10欄位

這種邊篩選又篩選的呈現方式 其實要好好考慮有無其必要
此方式後期大方向會非常複雜

建議用以下三種方式
1.改用第一種推薦的方式 用新增暫存表當作篩選區
2.不要在工作表處理篩選問題 只要用上userform1篩選
3.就只用工作表處理篩選問題 不要用上 userform1
作者: samwang    時間: 2021-7-29 12:49

本帖最後由 samwang 於 2021-7-29 13:04 編輯

回復 1# wang077

是這樣嗎? 請測試看看,謝謝
Private Sub ComboBox2_Change()
Range("$A$2:$AJ$65536").AutoFilter Field:=1, Criteria1:=ComboBox2.Text
End Sub

Private Sub CommandButton3_Click()
Dim Arr, Ar(), i&, j&
b = ComboBox1.Text
Sheets(b).Select
If Me.ComboBox2.Text <> "" And Me.ComboBox3.Text = "" Then
    Arr = Sheets(b).AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible)
    ReDim Ar(1 To UBound(Arr) + 1, 1 To UBound(Arr, 2))
    For j = 1 To UBound(Arr, 2)
        For i = 1 To UBound(Arr)
            If Arr(i, j) <> "" Then
            If j <> j1 Then j1 = j: n = n + 1
            If Ar(1, n) = "" Then Ar(1, n) = Cells(2, j)
            Ar(i + 1, n) = Arr(i, j)
            End If
        Next
    Next
    With Me.ListBox1
      .List = Ar
      .ColumnCount = n
    End With
End If
Sheets(b).Select
End Sub
作者: wang077    時間: 2021-7-29 13:49

回復 5# singo1232001
如果是把篩選的結果複製到新的工作表呢?
這樣會比較好處理嗎?
大大,我用你的檔案下去測試,listbox上良品的數值顯示好像錯誤了
好像也會抓到報廢那行
作者: wang077    時間: 2021-7-29 13:55

回復 6# samwang
測試過了,沒問題
如果listbox只要顯示A、B、C、D、AJ欄,且A、B、C欄不重複顯示呢?
還有AJ欄的良率,listbox上有辦法顯示xx.x%嗎
[attach]33784[/attach]
作者: Andy2483    時間: 2021-7-29 14:04

回復 1# wang077


    經驗分享:資料改為直式的好處,以樓主範例為例
1.日期可以持續擴充
2.欄位可以局部擴充
3.可以計算多種良率
  3.1.個別良率
  3.2.機台合計良率
  3.3.料號合計良率
  3.4.日期合計良率
  3.5.全部產品良率
  3.6.其他想要計算的良率
4.容易查詢歷史資料

以上參考!
作者: wang077    時間: 2021-7-29 14:25

回復 9# Andy2483
這也太強大,要理解程式碼虛要一點時間了
也謝謝大大提供方法參考
作者: samwang    時間: 2021-7-29 15:08

本帖最後由 samwang 於 2021-7-29 15:12 編輯

回復 8# wang077

請測試看看,謝謝

Private Sub CommandButton3_Click()
Dim Arr, Ar(), xD, i&, j&
Set xD = CreateObject("Scripting.Dictionary")
b = ComboBox1.Text
Sheets(b).Select
If Me.ComboBox2.Text <> "" And Me.ComboBox3.Text = "" Then
    Arr = Sheets(b).AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible)
    ReDim Ar(1 To UBound(Arr) + 1, 1 To UBound(Arr, 2))
    For j = 1 To UBound(Arr, 2)
        If j > 4 And j < 36 Then GoTo 99
        For i = 1 To UBound(Arr)
            If Arr(i, j) <> "" Then
                If xD(Arr(i, j)) <> 1 Then
                    xD(Arr(i, j)) = 1
                    If j <> j1 Then j1 = j: n = n + 1
                    If Ar(1, n) = "" Then Ar(1, n) = Cells(2, j)
                    If j = 36 And i = UBound(Arr) Then
                        Ar(i + 1, n) = Format(Arr(i, j), "0%")
                    Else
                        Ar(i + 1, n) = Arr(i, j)
                    End If
                End If
            End If
        Next
99: Next
    With Me.ListBox1
      .List = Ar
      .ColumnCount = n
    End With
End If
Sheets(b).Select
End Sub
作者: singo1232001    時間: 2021-7-29 15:32

本帖最後由 singo1232001 於 2021-7-29 15:34 編輯

回復 7# wang077


若想找資料架構的學習教材相關
請上網查詢 "資料庫正規化" "資料庫范式" 或者"資料庫架構" 與 "關聯式資料庫"
作者: wang077    時間: 2021-7-29 16:30

回復 12# singo1232001
非常感謝大大
我會去研究看看的!
作者: wang077    時間: 2021-7-29 16:32

本帖最後由 wang077 於 2021-7-29 16:35 編輯

回復 11# samwang
大大,如果我D欄只要入庫、良品、良率呢,且D欄可重複顯示
作者: samwang    時間: 2021-7-29 18:33

回復 14# wang077

請測試看看,謝謝

Private Sub CommandButton3_Click()
Dim Arr, Ar(), xD, i&, j&
Set xD = CreateObject("Scripting.Dictionary")
b = ComboBox1.Text
Sheets(b).Select
If Me.ComboBox2.Text <> "" And Me.ComboBox3.Text = "" Then
    Arr = Sheets(b).AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible)
    ReDim Ar(1 To UBound(Arr) + 1, 1 To UBound(Arr, 2))
    For j = 1 To UBound(Arr, 2)
        If j > 4 And j < 36 Then GoTo 99
        For i = 1 To UBound(Arr)
            If j > 3 Then
                If Arr(i, j) = "不良" Then i1 = i: GoTo 98
                If Arr(i, j) = "報廢" Then i2 = i: GoTo 98
                If i1 = i Or i2 = i Then GoTo 98
            End If
            If Arr(i, j) <> "" Then
                If xD(Arr(i, j)) <> 1 Then
                   If j < 35 Then xD(Arr(i, j)) = 1
                    If j <> j1 Then j1 = j: n = n + 1: m = 2
                    Ar(1, n) = Cells(2, j)
                    If j = 36 And i = UBound(Arr) Then
                        Ar(m, n) = Format(Arr(i, j), "0%")
                    Else
                        Ar(m, n) = Arr(i, j): m = m + 1
                    End If
                End If
            End If
98:   Next
99: Next
    With Me.ListBox1
       .ColumnWidths = "30,30,30,40,40"
      .List = Ar
      .ColumnCount = n
    End With
End If
Sheets(b).Select
End Sub
作者: wang077    時間: 2021-7-30 08:46

回復 15# samwang
大大,我有寄檔案到你的gmail
可以麻煩你看一下嗎,謝謝
作者: samwang    時間: 2021-7-30 11:33

回復 16# wang077

請測試看看,謝謝

Private Sub CommandButton3_Click()
Dim Arr, Ar(), xD, i&, j&
Set xD = CreateObject("Scripting.Dictionary")
b = ComboBox1.Text
Sheets(b).Select
If Me.ComboBox2.Text <> "" And Me.ComboBox3.Text = "" Then
    Arr = Sheets(b).AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible)
    ReDim Ar(1 To UBound(Arr), 1 To 4): m = 1
    For i = 1 To UBound(Arr)
        T = Arr(i, 1) & Arr(i, 2) & Arr(i, 4)
        If InStr(T, "提檢數") Or InStr(T, "良品數") Or InStr(T, "良率") Then
            If xD(T & "/3") <> 1 Then
                xD(T & "/3") = 1: m = m + 1
                If Ar(1, 1) = "" Then '第1列
                    Ar(1, 1) = Cells(2, 1): Ar(1, 2) = Cells(2, 2)
                    Ar(1, 3) = Cells(2, 4): Ar(1, 4) = Cells(2, 36)
                End If
                If xD(Arr(i, 1) & "/1") <> 1 Then xD(Arr(i, 1) & "/1") = 1: Ar(m, 1) = Arr(i, 1)
                If xD(Arr(i, 2) & "/2") <> 1 Then xD(Arr(i, 2) & "/2") = 1: Ar(m, 2) = Arr(i, 2)
                Ar(m, 3) = Arr(i, 4)
                If InStr(T, "良率") Then Ar(m, 4) = Format(Arr(i, 36), "0%") Else Ar(m, 4) = Arr(i, 36)
            End If
        End If
    Next
   
    With Me.ListBox1
      .ColumnWidths = "40,50,70,40"
      .List = Ar
      .ColumnCount = m
    End With
End If
Sheets(b).Select
End Sub
作者: samwang    時間: 2021-7-30 12:22

回復 16# wang077


不好意思,更新17樓程式,將第1列移到迴圈外,謝謝
   
Private Sub CommandButton3_Click()
Dim Arr, Ar(), xD, i&, j&
Set xD = CreateObject("Scripting.Dictionary")
b = ComboBox1.Text
Sheets(b).Select
If Me.ComboBox2.Text <> "" And Me.ComboBox3.Text = "" Then
    Arr = Sheets(b).AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible)
    ReDim Ar(1 To UBound(Arr), 1 To 4): m = 1
    Ar(1, 1) = Cells(2, 1): Ar(1, 2) = Cells(2, 2)  '第一列
    Ar(1, 3) = Cells(2, 4): Ar(1, 4) = Cells(2, 36)

   
    For i = 1 To UBound(Arr)
        T = Arr(i, 1) & Arr(i, 2) & Arr(i, 4)
        If InStr(T, "提檢數") Or InStr(T, "良品數") Or InStr(T, "良率") Then
            If xD(T & "/3") <> 1 Then
                xD(T & "/3") = 1: m = m + 1
                If xD(Arr(i, 1) & "/1") <> 1 Then xD(Arr(i, 1) & "/1") = 1: Ar(m, 1) = Arr(i, 1)
                If xD(Arr(i, 2) & "/2") <> 1 Then xD(Arr(i, 2) & "/2") = 1: Ar(m, 2) = Arr(i, 2)
                Ar(m, 3) = Arr(i, 4)
                If InStr(T, "良率") Then Ar(m, 4) = Format(Arr(i, 36), "0%") Else Ar(m, 4) = Arr(i, 36)
            End If
        End If
    Next
   
    With Me.ListBox1
      .ColumnWidths = "40,50,70,40"
      .List = Ar
      .ColumnCount = m
    End With
End If
Sheets(b).Select
End Sub
作者: wang077    時間: 2021-7-30 15:54

回復 18# samwang
感謝大大幫忙,我有回信到你的mail喔!
作者: 准提部林    時間: 2021-7-31 09:45

話說這種表單查詢有何做用???
若是因為表格橫寬及縱長太大, 想調出指定資料做修改,
那還是在原表操作較實在~~
作者: n7822123    時間: 2021-7-31 13:31

本帖最後由 n7822123 於 2021-7-31 13:34 編輯

回復 20# 准提部林

哈哈,我跟准大的想法一樣耶!  我也覺得這表單有點多餘

我應該會直接拿另一個表格當做操作介面

並在下面秀出查找的資料,做這表單還不是要 "資料處理",不會比較省事


作者: wang077    時間: 2021-8-2 08:00

回復 20# 准提部林
就像准大說的,原表太過於繁雜
主管想更快調出指定資料,所以用了表單
作者: wang077    時間: 2021-8-2 08:01

回復 21# n7822123
其實我也覺得麻煩,但畢竟主管要求




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)