Board logo

標題: [發問] 數字各取1 [打印本頁]

作者: ziv976688    時間: 2021-7-9 10:29     標題: 數字各取1

[attach]33547[/attach]
A2=B2:F2以下的數字各取1
下拉填滿。

請教:Excel 2003的函數公式?
謝謝!
作者: ziv976688    時間: 2021-7-9 12:56

A2=IF(MAX(A$1:A1)>=MAX($B$2:$F$26),"",SMALL($B$2:$F$26,COUNTIF($B$2:$F$26,"<="&N(A1))+1))
下拉填滿。
但當儲存格有多個數字並以","符號區隔時,不知道公式要怎麼改^^"
尚請各位大大不吝指導!謝謝!
作者: ML089    時間: 2021-7-9 14:59

數字不超過2位數整數嗎?
作者: ziv976688    時間: 2021-7-9 20:17

回復 3# ML089

是的!煩請指導。謝謝您!
作者: ML089    時間: 2021-7-10 11:48

回復 1# ziv976688

A2 陣列公式,如下
=LOOKUP(99,IF({1;0},{0,""},{1,1}*SMALL((FREQUENCY(--(0&TRIM(MID(SUBSTITUTE(B$2:B$33&","&C$2:C$33&","&D$2:D$33&","&E$2:E$33&","&F$2:F$33&",,,,,",",","         "),{0,1,2,3,4}*9+1,9))),ROW($1:$99)-1)=0)*999+(ROW($1:$100)-1),ROW(A2))))
以三鍵方式輸入公式(SHIT+CTRL+ENTER)

公式限制
數字1~99
B:F每一列合併之數字串數也不能太多(3~5個),因為字串分隔只插入9個空格,也可增加插入空格來提高字串數。
作者: 准提部林    時間: 2021-7-10 12:04

A2//陣列:
=TEXT(SMALL(IF(COUNTIF(B:F,TEXT(ROW($1:$39),"!*00!*")),ROW($1:$39),99),ROW(A1)),"[<99]00;")

數字限1~39
把a:f欄設成文字格式, 再將單獨的數字重新輸入為兩位數, 如:05,06
作者: ziv976688    時間: 2021-7-10 13:17

本帖最後由 ziv976688 於 2021-7-10 13:21 編輯

回復 5# ML089
測試1000期,單儲存格最多只見過3個數字,所以3~5個足夠用了。
感謝您的指導和幫忙
作者: ziv976688    時間: 2021-7-10 13:20

回復 6# 准提部林
多學習到拆解有區隔符號的數字之公式。
感謝您的指導和幫忙
作者: hcm19522    時間: 2021-7-10 14:23

本帖最後由 hcm19522 於 2021-7-22 11:17 編輯

https://blog.xuite.net/hcm19522/twblog/589903456
作者: ziv976688    時間: 2021-7-10 14:36

本帖最後由 ziv976688 於 2021-7-10 14:53 編輯

回復 9# hcm19522
我向小孩(年輕人用的版本比較新)借2007版測試看看。
感謝您的賜教和幫忙:D
作者: ziv976688    時間: 2021-7-19 06:54

本帖最後由 ziv976688 於 2021-7-19 07:02 編輯

回復 5# ML089
不好意思,我將公式套用在VBA語法中~產生偵錯。
只是FREQUENCY和TRIM和SUBSTITUTE等函數對我來說~太深奧了~
恐怕是我將原5欄39個號碼的貴解,套用在7欄49個號碼公式時有改錯了!?
煩請您幫我檢視一下~ 好嗎 ?
或者請您直接以程式語法解題(有看過您解過程式題 )。
謝謝您
[attach]33683[/attach]
[attach]33684[/attach] [attach]33685[/attach]
作者: samwang    時間: 2021-7-19 13:49

回復 11# ziv976688

請測試看看,謝謝

Private Sub CommandButton1_Click()
Dim Arr, xD, s%, Tm, a%, i&, j&
Set xD = CreateObject("Scripting.Dictionary")
Tm = Timer
Application.ScreenUpdating = False '在背景下執行
   For s = 1 To 6   '6個工作表
        Shrr = Array("準2進3", "準3進4", "準4進5", "準5進6", "準6進7", "準7進8")
        With Sheets(Shrr(s - 1))
            Arr = .Range("d1:j" & .[b65536].End(3).Row)
            For i = 2 To UBound(Arr)
                For j = 1 To UBound(Arr, 2)
                    If Arr(i, j) <> "" Then
                        If InStr(Arr(i, j), ",") Then
                            For w = 0 To UBound(Split(Arr(i, j), ","))
                            a = Split(Arr(i, j), ",")(w): xD(a) = ""
                            Next
                        Else
                            xD(Arr(i, j)) = ""
                        End If
                    End If
                Next
            Next
            If xD.Count > 0 Then
                For i = 1 To xD.Count: Arr(i, 1) = Application.Small(xD.keys, i): Next
                With .Range("a4").Resize(xD.Count, 1)
                    .NumberFormatLocal = "00": .Value = Arr
                End With
                .[a2] = xD.Count & "個": Erase Arr: xD.RemoveAll
            End If
        End With
   Next
MsgBox Timer - Tm
End Sub
作者: ziv976688    時間: 2021-7-19 14:38

回復 12# samwang
測試成功 !
執行效率優化許多~只可惜,我一直搞不懂Arr和Brr要怎麼設立範圍和運算?
所以遇到多個Sheet(s)的範圍要運算就一籌莫展
感謝您一再的幫忙~感恩
作者: ML089    時間: 2021-7-19 18:35

回復 11# ziv976688

不是很會寫VBA,湊一個給你參考

Private Sub CommandButton1_Click()
    Set xD = CreateObject("Scripting.Dictionary")
    Tm = Timer
    Application.ScreenUpdating = False    '在背景下執行
    Shrr = Array("準2進3", "準3進4", "準4進5", "準5進6", "準6進7", "準7進8")
    For s = 1 To 6   '6個工作表
        With Sheets(Shrr(s - 1))
            xRows = .[b65536].End(3).Row '資料最後一行位置
            .range("A2:A" & xRows).ClearContents '清除資料
            Arr = .range("D1:J" & xRows) '資料轉陣列,JOIN會快3倍 0.023 -> 0.0078
            xJoin = ""
            For Each x In Arr: xJoin = xJoin & IIf(x <> "", x & ",", ""): Next '合併D:J字串
            For Each xS In Split(xJoin, ","): xD(xS) = "": Next    '組字典
            If xD.Count > 0 Then
                .[A4].Resize(xD.Count, 1) = Application.Transpose(xD.keys)    '字典取唯一、水平轉垂直、填入儲存格
                .[A4].Resize(xD.Count, 1).Sort Key1:=.[A4], Order1:=xlAscending, Header:=xlNo    '儲存格排序
                .[A2] = xD.Count & "個": .[A3] = "號碼"
                Erase Arr: xD.RemoveAll
            End If
        End With
    Next
    MsgBox Timer - Tm
End Sub
作者: 准提部林    時間: 2021-7-19 19:02

Sub TEST()
Dim Brr(1 To 99, 0), xS As Worksheet, A, B
For Each xS In Sheets(Array("準2進3", "準3進4", "準4進5", "準5進6", "準6進7", "準7進8"))
    For Each A In xS.Range("d2:j" & xS.[b65536].End(xlUp).Row + 1).Value
        For Each B In Split(A, ",")
           Brr(B, 0) = B
        Next B
    Next
    With xS.[a4].Resize(99)
         .Value = Brr:  Erase Brr
         .Sort Key1:=.Item(1), Order1:=xlAscending, Header:=xlNo
    End With
Next
End Sub
作者: ziv976688    時間: 2021-7-20 12:23

本帖最後由 ziv976688 於 2021-7-20 12:41 編輯

回復 14# ML089
少了取1~~
有附上註明~幫助我能比較明瞭。
感謝版主的指導
作者: ziv976688    時間: 2021-7-20 12:26

回復 15# 准提部林
測試成功
感謝版主的指導
作者: ziv976688    時間: 2021-7-20 13:17

本帖最後由 ziv976688 於 2021-7-20 13:21 編輯

回復 14# ML089
不好意思,沒有注意到測試附件未上傳
[attach]33692[/attach]

有看到列17
.[A4].Resize(xD.Count, 1) = Application.Transpose(xD.keys)    '字典取唯一、水平轉垂直、填入儲存格
可是不知道怎麼修正
謝謝您
作者: ziv976688    時間: 2021-7-20 13:58

本帖最後由 ziv976688 於 2021-7-20 14:04 編輯

回復 15# 准提部林
不好意思,雖然能以別的方法解決,但很想研習您的語法~
請問  :
A2=COUNT(A4:A52)&"個"       '只要統計49格,因為最多也只有49個號碼
以您的語法,應該怎麼編寫 ?
謝謝您
作者: ML089    時間: 2021-7-20 15:05

回復 18# ziv976688

修正程式 02 與 2 會重複
Private Sub CommandButton1_Click()
    Dim s%, Tm
    Tm = Timer
    Set xD = CreateObject("Scripting.Dictionary")
    Tm = Timer
    Application.ScreenUpdating = False    '在背景下執行
    Shrr = Array("準2進3", "準3進4", "準4進5", "準5進6", "準6進7", "準7進8")
    For s = 1 To 6   '6個工作表
        With Sheets(Shrr(s - 1))
            xRows = .[b65536].End(3).Row    '資料最後一行位置
            .Range("A2:A" & xRows).ClearContents    '清除資料
            arr = .Range("D2:J" & xRows)    '資料轉陣列,JOIN會快3倍 0.023 -> 0.0078
            'xJoin = ""
            For Each x In arr: xJoin = xJoin & IIf(x <> "", x & ",", ""): Next    '合併D:J字串
            For Each xS In Split(xJoin, ",")
                If Val(xS) > 0 Then xD(Val(xS)) = "" '組字典
            Next
            If xD.Count > 0 Then
                .[A4].Resize(xD.Count, 1) = Application.Transpose(xD.keys)    '字典取唯一、水平轉垂直、填入儲存格
                .[A4].Resize(xD.Count, 1).Sort Key1:=.[A4], Order1:=xlAscending, Header:=xlNo    '儲存格排序
                .[A2] = xD.Count & "個": .[A3] = "號碼"
                Erase arr: xD.RemoveAll
            End If
        End With
    Next
    '     Sheets(Shrr).Copy
    '    ActiveWorkbook.SaveAs ThisWorkbook.Path & "\TEST_" & Nrange & "-" & Num & "期" & ".xls"
    '    ActiveWindow.Close
    'MsgBox Timer - Tm
End Sub
作者: 准提部林    時間: 2021-7-20 15:12

回復 19# ziv976688


with [A2]: .formula="=COUNT(A4:A52)&""個""" : .value=.value: end with

或 A2=application.COUNT(xS.[A4:A52]) & "個"
作者: ML089    時間: 2021-7-20 15:15

15樓寫得很精簡
學習重寫如下
Private Sub CommandButton1_Click()
    Set xD = CreateObject("Scripting.Dictionary")
    Tm = Timer
    Application.ScreenUpdating = False    '在背景下執行
    For Each xS In Sheets(Array("準2進3", "準3進4", "準4進5", "準5進6", "準6進7", "準7進8")) '取表格
        For Each xR In xS.Range("D2:J" & xS.[B65536].End(xlUp).Row) '取儲存格
            For Each sp In Split(xR, ",") '分開數字
                If Val(sp) > 0 Then xD(Val(sp)) = s '字典組合
            Next
        Next
        xS.[A4].Resize(99).ClearContents '清除儲存格內容
        xS.[a2] = xD.Count & "個": xS.[A3] = "號碼"
        If xD.Count = 0 Then Exit For
        With xS.[A4].Resize(xD.Count)
            .Value = Application.Transpose(xD.keys): xD.RemoveAll
            .Sort key1:=.Item(1), Order1:=xlAscending, Header:=xlNo
        End With
    Next
End Sub
作者: ziv976688    時間: 2021-7-20 15:23

測試OK了!
感謝您的耐心指導
作者: ziv976688    時間: 2021-7-20 15:26

回復 21# 准提部林
第二段是我想學習的~
感謝版主的耐心指導
作者: ziv976688    時間: 2021-7-20 16:26

本帖最後由 ziv976688 於 2021-7-20 16:29 編輯

回復 22# ML089
不好意思,回復20樓時,忘了點回復鍵。

貴程式碼都有註解,對我在學習上幫助甚大~感恩
完全OK了!
您學習得真快,我就差遠了。
謝謝您的耐心指導和幫忙
作者: ziv976688    時間: 2021-7-21 13:15

回復 12# samwang
回復 20# ML089
回復 21# 准提部林
http://forum.twbts.com/thread-23266-1-1.html
懇請各位大大指導和幫忙 !  謝謝
作者: ziv976688    時間: 2021-7-22 19:46

本帖最後由 ziv976688 於 2021-7-22 19:52 編輯

回復 22# ML089
[attach]33721[/attach]
不好意思,將這幾天的問題解答整理後,
想再向您請教幾個小問題 :
程式碼在Module3
1_列6的sp是什麼涵義?  special?
需不需要設立變數?
2_我現在設立的變數對不對?夠不夠全?
謝謝您
PS : 目前檔案執行正常~可Run出正確答案。
作者: ziv976688    時間: 2021-7-22 19:50

回復 21# 准提部林
Sub 餘數各取1()
Dim Brr(1 To 99, 0), xS As Worksheet, A, B
For Each xS In Sheets(Array("準2進3", "準3進4", "準4進5", "準5進6", "準6進7", "準7進8"))
    For Each A In xS.Range("d2:j" & xS.[b65536].End(xlUp).Row + 1).Value
        For Each B In Split(A, ",")
           Brr(B, 0) = B
        Next B
    Next
    With xS.[a4].Resize(99)
         .Value = Brr:  Erase Brr
         .Sort Key1:=.Item(1), Order1:=xlAscending, Header:=xlNo
    End With
'   With xS.[a2] = Application.Count(xS.[A4:A52]) & "個": End With
Next
End Sub
請問 :
列13是我寫錯程式碼,還是我放錯位列?
請您賜正。
謝謝您
作者: ML089    時間: 2021-7-22 20:41

回復 27# ziv976688

1_列6的sp是什麼涵義?  special?
需不需要設立變數?
2_我現在設立的變數對不對?夠不夠全?

SP是一個變數,名稱為隨意定,當初是以 Split 簡寫
好的程式應該是要定義變數比較嚴謹,因為VBA不強迫宣告變數,加上我是業餘寫小程式就沒習慣定義變數。

這小程式有4個變數可以定義如下   
Dim xD As Object, xS As Worksheet, xR As Range, SP
作者: ziv976688    時間: 2021-7-22 20:52

回復 29# ML089
版主 :您好!
瞭解了!
感謝您的耐心指導和幫忙
作者: 准提部林    時間: 2021-7-22 21:24

回復 28# ziv976688


第2種公式, 不須用with ~~ end with
作者: ziv976688    時間: 2021-7-22 22:02

回復 31# 准提部林
哈~我真是假會~~
感謝版主不厭其煩的指導和幫忙




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