Board logo

標題: [發問] 使用VBA自訂範圍資料驗證失敗 [打印本頁]

作者: PKKO    時間: 2015-1-2 18:21     標題: 使用VBA自訂範圍資料驗證失敗

想請教大大們為何會失敗呢~?
'自訂區域
With Sheets("轉換表")
        myRange = .Range("s2:s" & .Range("s65536").End(xlUp).Row) '資料驗證用
end With

'資料驗證選單
'試過兩種方式
'第一種
    For Each e In myRange
        arr = arr & "," & e
    Next
    arr = Split(Mid(arr, 2, 10000), ",")
    With Range("d2:d" & allr).Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:=arr
    End With
'第二種是直接將Arr換成myRange
作者: PKKO    時間: 2015-1-6 20:34

想請教大大們為何會失敗呢~?
'自訂區域
With Sheets("轉換表")
        myRange = .Range("s2:s" & .Ran ...
PKKO 發表於 2015-1-2 18:21



    高手大大們~求助求助~
作者: owen06    時間: 2015-1-6 22:27

回復 2# PKKO


    改這樣試試
  1. Dim myrange As Range
  2. With Sheets("轉換表")
  3.      Set myrange = .Range("s2:s" & .Range("s65536").End(xlUp).Row) '資料驗證用
  4. End With
複製代碼

作者: PKKO    時間: 2015-1-7 18:03

我改成以下,仍無法使用
  1. With Sheets("轉換表")
  2.         cc = .Rows(1).Find("所有單位", Lookat:=xlWhole).Column '代號的Column
  3.         Set myRange = .Range("T2:T" & .Range("T65536").End(xlUp).Row) '資料驗證用
  4.         For Each e In myRange
  5.             ARR = ARR & "," & e
  6.         Next
  7.         ARR = Split(Mid(ARR, 2, 10000), ",")'看過陣列的值確定沒問題
  8.         With Range("d2:d" & allr).Validation
  9.             .Delete
  10.             .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
  11.             xlBetween, Formula1:=ARR'卡在這邊
  12.         End With
  13. End With
複製代碼

作者: PKKO    時間: 2015-3-1 22:47

請問資料驗證的部分有大大能提供好的解決方案嗎?
還有資料驗證要如何輸入空白阿?就是選錯之後,可以再選成空白
作者: HUNGCHILIN    時間: 2015-3-1 23:13

本帖最後由 HUNGCHILIN 於 2015-3-1 23:53 編輯

回復 5# PKKO

選錯之後 要再用選的 空白 就要在清單內有一空白選項
就是DATA 要有空白格
就是驗證清單有空白格

您上面的程式就綠色的那行有問題.變成註解就可以執行
Public Sub AAAAAA()
With Me
        cc = .Rows(1).Find("所有單位", Lookat:=xlWhole).Column '代號的Column
        Set myRange = .Range("A2:A" & .Range("A65536").End(xlUp).Row) '資料驗證用
        For Each e In myRange
            ARR = ARR & "," & e
        Next
        
    MsgBox ARR
        
       ' ARR = Split(Mid(ARR, 2, 10000), ",") '看過陣列的值確定沒問題
        With .Range("d2:d10").Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:=ARR
        End With
End With
End Sub
作者: HUNGCHILIN    時間: 2015-3-2 00:10

本帖最後由 HUNGCHILIN 於 2015-3-2 00:11 編輯

With Me
        CC = .Rows(1).Find("所有單位", Lookat:=xlWhole).Column '代號的Column
        
        
        myRange = .[A1].Resize(.Cells(.Rows.Count, 1).End(xlUp).Row, 1).Value
      
        
        For Each e In myRange
            ARR = ARR & "," & e
        Next

'       ' ARR = Split(Mid(ARR, 2, 10000), ",") '?
        With .Range("d2:d10").Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:=ARR
        End With
End With
作者: GBKEE    時間: 2015-3-2 07:02

回復 5# PKKO
資料驗證要如何輸入空白,直接清空.
  1. '** 資料驗證選單來源
  2.     '1 資料驗證選單來源是儲存格位置:但需是是同一工作表的儲存格
  3.     'With Range("d2:d" & allr).Validation
  4.     '   .Delete
  5.     '    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
  6.     '    xlBetween, Formula1:="=" & Range("A2:A10").Address
  7.     'End With
  8.    
  9.    '2 資料驗證選單來源用 ","連接的字串
  10.     With Sheets("轉換表")
  11.         myRange = .Range("s2:s" & .Range("s65536").End(xlUp).Row) '資料驗證用
  12.     End With
  13.     '** 陣列轉換成字串
  14.    
  15.     '** Join 函數 傳回一個字串,該字串是透過連結某個陣列中的多個子字串而建立的。
  16.     '** myRange參照儲存格是為二維陣列,需轉成一維陣列方可為Join 函數使用
  17.     'arr = Join(Application.Transpose(myRange), ",")
  18.    
  19.     '** 跑迴圈取得字串
  20.     'For Each e In myRange
  21.     '   arr = arr & "," & e
  22.     'Next
  23.      
  24.     '** Split 函數 傳回一個陳列索引從零開始的一維陣列,它包含指定數目的子字串。
  25.     '** arr = Split(Mid(arr, 2, 10000), ",") '錯誤的用法,因為 arr 傳回陣列,
  26.     '** arr 須是 字串.
  27.    
  28.     '************************************************
  29.    
  30.     With Range("d2:d" & allr).Validation
  31.         .Delete
  32.         .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
  33.         xlBetween, Formula1:=Join(Application.Transpose(myRange), ",") '<- arr
  34.     End With
複製代碼

作者: PKKO    時間: 2015-3-7 17:30

回復 8# GBKEE


    感謝,原來如此!
作者: PKKO    時間: 2015-3-7 17:32

回復 6# HUNGCHILIN

版主大大,可否請教您使用的 With Me => 這個Me 代表的是?
作者: HUNGCHILIN    時間: 2015-3-7 23:49

本帖最後由 HUNGCHILIN 於 2015-3-7 23:54 編輯

回復 10# PKKO
阿吉測試時把程式貼在,Sheets("轉換表") 的工作表程式区内,故直接用Me,就可以了,
如果程式放在 模組1 内,就一定要指定,with Sheets("轉換表"),
我通常較少用 Sheets("轉換表")的寫法,因為改Sheet名稱程式就會報錯誤提示。
有時用Sheet1,Sheet2寫法較佳。
作者: PKKO    時間: 2015-3-8 01:26

本帖最後由 PKKO 於 2015-3-8 01:32 編輯

感謝版主大大,原來如此!

但想問一下,若是已經放在該SHEET內的程式碼

不就可以直接使用ex: CELLS(1,1),不需要WITH

還是說透過WITH 裡面[ . 的程式碼]執行速度會比較快?
作者: GBKEE    時間: 2015-3-8 06:19

回復 12# PKKO
不是速度快,可指定這物件的屬性,子物件
  1. With Cells(1, 1)
  2.         .Value = 555
  3.         .Interior.Color = vbRed
  4.         With .Font
  5.             .Bold = True
  6.             .ColorIndex = xlAutomatic
  7.         End With
  8.    End With
複製代碼

作者: PKKO    時間: 2015-3-8 20:47

回復 13# GBKEE


    恩恩,感謝!

   但若是已經放在該SHEET內應該就可以直接用 Rows(1).Find("所有單位", Lookat:=xlWhole).Column '代號的Column

而不用使用以下的寫法
WITH ME
   .Rows(1).Find("所有單位", Lookat:=xlWhole).Column '代號的Column
END WITH

當然版主大大是因為直接修改我的程式碼會比較快,但除此之外
如果是自己撰寫程式碼的話,WITH ME因該是沒有存在的必要?(假設已經將程式碼放置在該SHEET內的話)
還是有其他的用法?
作者: HUNGCHILIN    時間: 2015-3-9 00:17

本帖最後由 HUNGCHILIN 於 2015-3-9 00:24 編輯

只是單純的測試程式,沒別的
簡化程式,很好的想法
作者: GBKEE    時間: 2015-3-9 06:39

回復 14# PKKO


   
WITH ME因該是沒有存在的必要?(假設已經將程式碼放置在該SHEET內的話)
也不是如此的說法,可簡化程式碼的key in .

如圖 工具->選項 的勾選
如對vba的語法不熟,也可加快程式碼的編寫,熟悉.


[attach]20397[/attach]
作者: PKKO    時間: 2015-3-9 08:48

回復 16# GBKEE


   嗯嗯嗯!我了解了,確實也可以加快撰寫程式碼的速度,謝謝哦!!




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