Board logo

標題: [發問] ByVal a As Range~此類語法的用法,不太清楚 [打印本頁]

作者: sayloveme    時間: 2011-12-30 10:15     標題: ByVal a As Range~此類語法的用法,不太清楚

本帖最後由 sayloveme 於 2011-12-30 14:21 編輯

Public Function FmdFatotal(ByVal a As Range, ByVal b As Range, ByVal c As Integer, ByVal pollutant As String) As Double
   Dim IRptData As Integer
   
   IRptData = 6
   FmdSTotal = 0
   
    Do Until Left(Trim(Sheets("資料").Cells(IRptData, 4).Value), 1) = "本"
        If Sheets("資料").Cells(IRptData, 21) > c Then
            If Trim(Sheets("資料").Cells(IRptData, 9).Value) = pollutant Then
                FmdFatotal = FmdFatotal + Sheets("資料").Cells(IRptData, 20)
            End If
        End If
        IRptData = IRptData + 1
    Loop
End Function

--------------------------我是分隔線----------------------
關於這段語法,想請教版上的高手,是否能夠幫我解釋一下,找尋了各大網站,IRptData 跟Do Until Left(Trim(Sheets("資料").Cells(IRptData, 4).Value), 1),這段語法,完全看不懂~還請神人大大賜教,感激不進~!!謝謝
作者: kobo    時間: 2011-12-30 11:15

IRptData -->自訂的整數變數
程式第二行己說明了 (Dim IRptData As Integer)
Do ..... Loop --> 重覆執行 .....  陳述式(迴圈)
以上應是vba基本功,在excel 的vba編緝器中的說明檔中都有範例說明
善用vba編緝器中的說明檔,可讓您的vba功力大增
作者: sayloveme    時間: 2011-12-30 12:52

回復 2# kobo


  大大您好,那像是Dim IRptData As Integer,已經定義為整數了,為何底下IRptData = 6、FmdSTotal = 0 還要進行這樣的設定,那個6是否有點多餘呢?,
還是說它有甚麼特定含義呢!? 謝謝,另外 Until Left (Trim(Sheets("審查資料").Cells(IRptData, 4).Value), 1),這串語法當中,
比較不懂的是Until Left (Trim(資料).Cells(自定義,4).Value),1),這樣的做法,會有甚麼樣的效果呢!?已用粗體標示,非常謝謝您的回答。
作者: sayloveme    時間: 2011-12-30 13:35

回復 2# kobo

感謝大大,依照大大給的方向仔細瀏覽過一遍,心裡大概有個方向,有個部份想再請教一下,
IRptData = 6
   FmdSTotal = 0
   
    Do Until Left(Trim(Sheets("審查資料").Cells(IRptData, 4).Value), 1) ="本"

其中Cells(IRptData, 4)這個是否能夠看成Cells(6, 4),另外最後="本"這個有甚麼作用嘛!? 謝謝大大
作者: hugh0620    時間: 2011-12-30 15:07

本帖最後由 hugh0620 於 2011-12-30 15:15 編輯

回復 4# sayloveme


    因為它是寫 迴圈 DO... LOOP
    當判定資料="本"時~ 就離開回圈  
    (迴圈需要有一個停止的條件~ Do until 條件式 =>符合這個條件就離開迴圈~
     像你放上去的程式碼很可能會產生循環迴圈中~  因為有可能資料會有"本"這個資料)
    進行下一段程式碼或離開程式
作者: kobo    時間: 2011-12-30 15:08

本帖最後由 kobo 於 2011-12-30 15:10 編輯

Dim IRptData As Integer '   宣告IRptData 為整數
   IRptData = 6                '  IRptData 初始值為 6
   ..........
   ↓↓↓↓ 重覆執行迴圈,直到 Left(Trim.....), 1) = "本" 成立為止↓↓↓↓(條件成立跳出迴圈)
    Do Until Left(Trim(Sheets("資料").Cells(IRptData, 4).Value), 1) = "本"  (IRptData第一次是6)
      .............
        IRptData = IRptData + 1   '每執行一次 IRptData 就加 1   
    Loop
作者: GBKEE    時間: 2011-12-30 16:56

Do   While  條件  (條件成立 執行迴圈)  /  Until  條件  (條件成立 不執行迴圈)  ***可置於 Do
     if  條件=True Then   Exit Do                          '*** 也可中間設立條件 離開迴圈
Loop    While  條件  (條件成立 執行迴圈)  /  Until  條件  (條件成立 不執行迴圈)  ***也可置於 Loop
作者: sayloveme    時間: 2011-12-30 17:06

本帖最後由 sayloveme 於 2011-12-30 17:24 編輯

回復 5#、6#、7#


感謝大大們的回覆,小弟另外有個困擾,建立好的巨集,無法正確建立檔案名,例如我99年~正常出來會是099X,但如果我輸入100年,他跑出來的檔案名卻是010,
請問有甚麼方法可以解決嘛!? 目前代碼情況如下:

YS = YS_Y & " 年 " & YS_S
  WestYS1 = CLng(1910 + CLng(YS_Y))
  WestYS2 = CLng(1912 + CLng(YS_Y))
  
  Filename = UCase(FacNo.Text) & "_" & GetSsn(YS)
   If CLng(YS_Y) > 95 Then '加入96年新表單
    lsExcelModel = lsExcelFilePath & "96年試算表.xls"
   Else
    lsExcelModel = lsExcelFilePath & "試算表.xls"
   End If
  Workbooks.Open Filename:=lsExcelModel
  Sheets.Add After:=Worksheets(Worksheets.Count)
  Sheets(ActiveCell.Worksheet.Name).Select
  Sheets(ActiveCell.Worksheet.Name).Name = "匯入"
      Columns("A:AZ").Select
      Selection.NumberFormatLocal = "@"
  ActiveWorkbook.SaveAs Filename:=lsExcelFilePath & "建檔資料\" & Filename & ".xls" '存檔路徑
'----------------------------------------------------取出資料
  EmptyRowIndex = GetEmptyRowIndex("匯入")
  Cells(EmptyRowIndex, 3).Value = "#" & "P_Factory" & "#"
  SQLStr = "SELECT P_Factory.* FROM P_Factory WHERE (((P_Factory.管制編號)='" & FacNo & "'))"
  Call GetDataFromDB(lsDBFilePathName, SQLStr, EmptyRowIndex + 1, "Yes")
-----------------我是分隔線---------------------------

請問大大以上有缺甚麼資料嗎!? 還是有甚麼需要修改的嘛!? 先謝謝各位大大的不吝告知,萬分感謝。
作者: sayloveme    時間: 2012-1-2 11:53

回復 8# sayloveme

請問版上的高手,8樓的問題該如何解決呢~拜託各位大大了
作者: GBKEE    時間: 2012-1-2 12:23

回復 9# sayloveme
只是片段的程式碼!!, 誰能解答?
作者: kobo    時間: 2012-1-2 13:03

建議請將檔案上傳,把您的問題說清楚
作者: sayloveme    時間: 2012-1-2 13:33

回復 9#、10#

先謝謝大大們,補齊上述所需之資料~如下所示:

Sub CreateFile_Click()
'"建檔"功能
Dim I, J As Long
'
  
  UserForm1.Hide
'認證
Call admit(adm)
    If adm = 2 Then
         MsgBox "您的巨集尚未更新,請去O槽將巨集更新"
         Exit Sub
    End If
'--------------
  
  YS = YS_Y & " 年 " & YS_S
  WestYS1 = CLng(1910 + CLng(YS_Y))
  WestYS2 = CLng(1912 + CLng(YS_Y))
  
'
  Filename = UCase(FacNo.Text) & "_" & GetSsn(YS)
   If CLng(YS_Y) > 95 Then '加入96年新表單
    lsExcelModel = lsExcelFilePath & "96年試算表.xls"
   Else
    lsExcelModel = lsExcelFilePath & "試算表.xls"
   End If
  Workbooks.Open Filename:=lsExcelModel
  Sheets.Add After:=Worksheets(Worksheets.Count)
  Sheets(ActiveCell.Worksheet.Name).Select
  Sheets(ActiveCell.Worksheet.Name).Name = "匯入"
      Columns("A:AZ").Select
      Selection.NumberFormatLocal = "@"
  ActiveWorkbook.SaveAs Filename:=lsExcelFilePath & "建檔資料\" & Filename & ".xls" '存檔路徑
'----------------------------------------------------取出資料
  EmptyRowIndex = GetEmptyRowIndex("匯入")
  Cells(EmptyRowIndex, 3).Value = "#" & "P_Factory" & "#" '工廠基本資料
  SQLStr = "SELECT P_Factory.* FROM P_Factory WHERE (((P_Factory.管制編號)='" & FacNo & "'))"
  Call GetDataFromDB(lsDBFilePathName, SQLStr, EmptyRowIndex + 1, "Yes")


If CLng(YS_Y) <= 95 Then '95年前匯入檔案功能
'
  EmptyRowIndex = GetEmptyRowIndex("匯入")
  Cells(EmptyRowIndex, 3).Value = "#" & "P_Exp" & "#" '申報書登載資料
  SQLStr = "SELECT P_Exp.* FROM P_Exp RIGHT JOIN P_Factory ON P_Exp.R_P_FTsn = P_Factory.P_FTsn "
  SQLStr = SQLStr & "WHERE (((P_Factory.管制編號)='" & FacNo & "') AND ((P_Exp.年度季別)='" & GetSsn(YS) & "')) ORDER BY P_Exp.R_P_FTsn, P_Exp.年度季別, P_Exp.補件"
  Call GetDataFromDB(lsDBFilePathName, SQLStr, EmptyRowIndex + 1, "Yes")
'
  EmptyRowIndex = GetEmptyRowIndex("匯入")
  Cells(EmptyRowIndex, 3).Value = "#" & "P_Exp_Pipe_0" & "#" '申報資料,P_Exp_Pipe_0
  SQLStr = "SELECT P_Exp_Pipe_0.* "
  SQLStr = SQLStr & "FROM P_Factory LEFT JOIN (P_Exp LEFT JOIN P_Exp_Pipe_0 ON P_Exp.PESn = P_Exp_Pipe_0.R_PEsn) ON P_Factory.P_FTsn = P_Exp.R_P_FTsn "
  SQLStr = SQLStr & "WHERE (((P_Factory.管制編號)='" & FacNo & "') AND ((P_Exp.年度季別)='" & GetSsn(YS) & "') AND ((P_Exp_Pipe_0.R_PEsn) Is Not Null)) "
  SQLStr = SQLStr & "ORDER BY P_Exp_Pipe_0.煙道編號, P_Exp_Pipe_0.污染源編號, P_Exp_Pipe_0.月份"
  Call GetDataFromDB(lsDBFilePathName, SQLStr, EmptyRowIndex + 1, "Yes")
'
  EmptyRowIndex = GetEmptyRowIndex("匯入")
  Cells(EmptyRowIndex, 3).Value = "#" & "P_Exp_Pipe_1" & "#" '初審資料
  SQLStr = "SELECT P_Exp_Pipe_1.* "
  SQLStr = SQLStr & "FROM P_Factory LEFT JOIN (P_Exp LEFT JOIN P_Exp_Pipe_1 ON P_Exp.PESn = P_Exp_Pipe_1.R_PEsn) ON P_Factory.P_FTsn = P_Exp.R_P_FTsn "
  SQLStr = SQLStr & "WHERE (((P_Factory.管制編號)='" & FacNo & "') AND ((P_Exp.年度季別)='" & GetSsn(YS) & "') AND ((P_Exp_Pipe_1.R_PEsn) Is Not Null)) "
  SQLStr = SQLStr & "ORDER BY P_Exp_Pipe_1.煙道編號, P_Exp_Pipe_1.污染源編號, P_Exp_Pipe_1.月份"
  Call GetDataFromDB(lsDBFilePathName, SQLStr, EmptyRowIndex + 1, "Yes")
'
Else '96年匯入檔案
  EmptyRowIndex = GetEmptyRowIndex("匯入")
  Cells(EmptyRowIndex, 3).Value = "#" & "applyusersend" & "#" '申報書登載資料
  SQLStr = "SELECT applyusersend.* FROM applyusersend "
  SQLStr = SQLStr & "WHERE (((applyusersend.管制編號)='" & FacNo & "') AND ((applyusersend.年度季別)='" & GetSsn(YS) & "'))"
  Call GetDataFromDB(lsDBFilePathName, SQLStr, EmptyRowIndex + 1, "Yes")

  EmptyRowIndex = GetEmptyRowIndex("匯入")
  Cells(EmptyRowIndex, 3).Value = "#" & "chimneyapply" & "#" '申報資料
  SQLStr = "SELECT chimneyapply.* FROM chimneyapply "
  SQLStr = SQLStr & "WHERE (((chimneyapply.管制編號)='" & FacNo & "') AND ((chimneyapply.年度季別)='" & GetSsn(YS) & "'))"
  SQLStr = SQLStr & "ORDER BY chimneyapply.煙道編號, chimneyapply.污染源編號, chimneyapply.月份"
  Call GetDataFromDB(lsDBFilePathName, SQLStr, EmptyRowIndex + 1, "Yes")

End If

'kuo add start 94/5/24
  EmptyRowIndex = GetEmptyRowIndex("匯入")
  Cells(EmptyRowIndex, 3).Value = "#" & "X_ExpRep" & "#" '
  SQLStr = "SELECT DISTINCT X_ExpRep.* "
  SQLStr = SQLStr & "FROM X_ExpRep LEFT JOIN X_ExpRepPol ON (X_ExpRep.XERPFTFacNo = X_ExpRepPol.XRPPFTFacNo) AND (X_ExpRep.XERMEREquipNo = X_ExpRepPol.XRPMEREquipNoP) AND (X_ExpRep.XERSDate = X_ExpRepPol.XRPSDate) AND (X_ExpRep.XEROrder = X_ExpRepPol.XRPOrder) AND (X_ExpRep.XERPosition = X_ExpRepPol.XRPPosition) AND (X_ExpRep.XERFlag = X_ExpRepPol.XRPFlag) "
  SQLStr = SQLStr & "WHERE (((X_ExpRepPol.XRPCPOName)='硫氧化物' Or (X_ExpRepPol.XRPCPOName)='氮氧化物') AND ((X_ExpRep.XERPFTFacNo)='" & FacNo & "') AND ((Year([XERSDate])) >=" & WestYS1 & ") AND ((Year([XERSDate])) <=" & WestYS2 & "))"
  Call GetDataFromDB(lsExpDBFilePathName, SQLStr, EmptyRowIndex + 1, "Yes")
'
  -待續
作者: sayloveme    時間: 2012-1-2 13:34

EmptyRowIndex = GetEmptyRowIndex("匯入")
  Cells(EmptyRowIndex, 3).Value = "#" & "X_ExpRepPol" & "#" '
  SQLStr = "SELECT X_ExpRepPol.* FROM X_ExpRepPol "
  SQLStr = SQLStr & "WHERE (((X_ExpRepPol.XRPPFTFacNo)='" & FacNo & "') AND ((X_ExpRepPol.XRPCPOName)='硫氧化物') AND ((Year([XRPSDate]))>=" & WestYS1 & ")) OR (((X_ExpRepPol.XRPPFTFacNo)='" & FacNo & "') AND ((X_ExpRepPol.XRPCPOName)='氮氧化物') AND ((Year([XRPSDate]))>=" & WestYS1 & "))"
  Call GetDataFromDB(lsExpDBFilePathName, SQLStr, EmptyRowIndex + 1, "Yes")
'
  EmptyRowIndex = GetEmptyRowIndex("匯入")
  Cells(EmptyRowIndex, 3).Value = "#" & "X_ExpCtl" & "#" '
  SQLStr = "SELECT X_ExpCtl.* FROM X_ExpCtl WHERE (((X_ExpCtl.XECPFTFacNo)='" & FacNo & "') AND ((Year([XECSDate]))>=" & WestYS1 & "))"
  Call GetDataFromDB(lsExpDBFilePathName, SQLStr, EmptyRowIndex + 1, "Yes")
'
  EmptyRowIndex = GetEmptyRowIndex("匯入")
  Cells(EmptyRowIndex, 3).Value = "#" & "X_ExpCtlPol" & "#" '
  SQLStr = "SELECT X_ExpCtlPol.* FROM X_ExpCtlPol WHERE (((X_ExpCtlPol.XCPPFTFacNo)='" & FacNo & "') AND ((X_ExpCtlPol.XCPCPOName)='硫氧化物') AND ((Year([XCPSDate]))>=" & WestYS1 & ")) OR (((X_ExpCtlPol.XCPPFTFacNo)='" & FacNo & "') AND ((X_ExpCtlPol.XCPCPOName)='氮氧化物') AND ((Year([XCPSDate]))>=" & WestYS1 & "))"
  Call GetDataFromDB(lsExpDBFilePathName, SQLStr, EmptyRowIndex + 1, "Yes")
'
  EmptyRowIndex = GetEmptyRowIndex("匯入")
  Cells(EmptyRowIndex, 3).Value = "#" & "X_ExpRepReq" & "#" '
  SQLStr = "SELECT X_ExpRepReq.* "
  SQLStr = SQLStr & "FROM X_ExpRep LEFT JOIN X_ExpRepReq ON (X_ExpRep.XERMEREquipNo = X_ExpRepReq.XRRMEREquipNoP) AND (X_ExpRep.XERFlag = X_ExpRepReq.XRRFlag) AND (X_ExpRep.XERPosition = X_ExpRepReq.XRRPosition) AND (X_ExpRep.XEROrder = X_ExpRepReq.XRROrder) AND (X_ExpRep.XERSDate = X_ExpRepReq.XRRSDate) AND (X_ExpRep.XERPFTFacNo = X_ExpRepReq.XRRPFTFacNo) "
  SQLStr = SQLStr & "WHERE (((X_ExpRepReq.XRRSn) Is Not Null) AND ((Year([XERSDate]))>=" & WestYS1 & ") AND ((X_ExpRep.XERPFTFacNo)='" & FacNo & "') AND ((X_ExpRepReq.XRRKind)<3)) "
  SQLStr = SQLStr & "ORDER BY X_ExpRep.XERMEREquipNo, X_ExpRep.XERSDate, X_ExpRep.XEROrder, X_ExpRepReq.XRRSn"
  Call GetDataFromDB(lsExpDBFilePathName, SQLStr, EmptyRowIndex + 1, "Yes")
'
  EmptyRowIndex = GetEmptyRowIndex("匯入")
  Cells(EmptyRowIndex, 3).Value = "#" & "X_ExpRepAgt" & "#" '
  SQLStr = "SELECT X_ExpRepAgt.* "
  SQLStr = SQLStr & "FROM X_ExpRep LEFT JOIN X_ExpRepAgt ON (X_ExpRep.XERFlag = X_ExpRepAgt.XRAFlag) AND (X_ExpRep.XERPosition = X_ExpRepAgt.XRAPosition) AND (X_ExpRep.XEROrder = X_ExpRepAgt.XRAOrder) AND (X_ExpRep.XERSDate = X_ExpRepAgt.XRASDate) AND (X_ExpRep.XERMEREquipNo = X_ExpRepAgt.XRAMEREquipNoP) AND (X_ExpRep.XERPFTFacNo = X_ExpRepAgt.XRAPFTFacNo) "
  SQLStr = SQLStr & "WHERE (((X_ExpRepAgt.XRASn) Is Not Null) AND ((X_ExpRep.XERPFTFacNo)='" & FacNo & "') AND (Year([XERSDate])>2002)) "
  SQLStr = SQLStr & "ORDER BY  X_ExpRepAgt.XRASn"
  Call GetDataFromDB(lsExpDBFilePathName, SQLStr, EmptyRowIndex + 1, "No")


'
  EmptyRowIndex = GetEmptyRowIndex("匯入")
  Cells(EmptyRowIndex, 3).Value = "#" & "End" & "#"
'----------------------------------------------------求取P_FactoryStartRowNbr,P_FactoryCount,P_FactoryFieldCount
Call GetIndex("匯入", "P_Factory")
If CLng(YS_Y) <= 95 Then '95年匯入功能
Call GetIndex("匯入", "P_Exp")
Call GetIndex("匯入", "P_Exp_Pipe_0")
Call GetIndex("匯入", "P_Exp_Pipe_1")
Else
Call GetIndex("匯入", "applyusersend")
Call GetIndex("匯入", "chimneyapply")
End If

Call GetIndex("匯入", "X_ExpRep")
Call GetIndex("匯入", "X_ExpRepPol")
Call GetIndex("匯入", "X_ExpCtl")
Call GetIndex("匯入", "X_ExpCtlPol")
Call GetIndex("匯入", "X_ExpRepReq")
Call GetIndex("匯入", "X_ExpRepAgt")
Call GetIndex("匯入", "End")
'
If P_FactoryCount = 0 Then
MsgBox "在P_Factory中,找不到資料,無法繼續執行"
Exit Sub
End If
If P_FactoryCount > 1 Then
MsgBox "在P_Factory中,資料大於1筆,無法繼續執行"
Exit Sub
End If
'配合961季修正
'If P_ExpCount = 0 Then
'MsgBox "在P_Exp中,找不到資料,無法繼續執行"
'Exit Sub
'End If
'If P_Exp_Pipe_0Count = 0 Then
'MsgBox "在申報中,找不到資料,無法繼續執行"
'Exit Sub
'End If
'改成無初審資料也可審查
'If P_Exp_Pipe_1Count = 0 Then
'MsgBox "在初審中,找不到資料,無法繼續執行"
'Exit Sub
'End If
'----------------------------------------------------填入資料
  Call Filldata
'----------------------------------------------------
'
ActiveWorkbook.Save '存檔
End Sub
-----------------------------------------------------------------------我是分隔線--------

拜託各位大大,求解為何我輸入是99年時,存檔的型態是檔名_099X,其中X是分為4季,但當我是輸入100年時,存檔卻是檔名_010,無法顯示季別。
YS = YS_Y & " 年 " & YS_S   
YS_Y 為年度季別、YS_S 為季別

先謝謝各位!! 謝謝大家
作者: GBKEE    時間: 2012-1-2 14:04

回復 13# sayloveme
但當我是輸入100年時,存檔卻是檔名_010,無法顯示季別。
變數不要設與關鍵字相同
ActiveWorkbook.SaveAs Filename:=lsExcelFilePath & "建檔資料\" & Filename & ".xls" '存檔路徑
存檔檔名 ->  Filename = UCase(FacNo.Text) & "_" & GetSsn(YS)  ->   FacNo.Text   ,  GetSsn(YS)  它的(字串,值) 不知道
你上傳了一堆程式碼 還是片段  11# 不是建議請將檔案上傳,把您的問題說清楚
作者: kobo    時間: 2012-1-2 14:38

看到您貼上來的程式碼,作者應是對程式語言具有相當的功力,
研判您是想延用此一檔案與程序,建議您直接與作者連繫,以解決您的問題
或是將整個excel檔案上傳尋求解答
作者: sayloveme    時間: 2012-1-2 15:14

回復 14#、15#

先謝謝兩位大大的解釋,的確此版本是經由本公司人員寫出,但由於總公司人員在台北,而我們目前在高雄,加上此版早在民國90年左右就有了,
加上前後不少人員更新過版本且年代久遠,我也無法了解這當中某些字串是否與當時檔案有相關連結,人員的變動加上檔案久遠,加上我並非專業本科出身,
可能造成各位麻煩,在此向大家說聲抱歉。

檔案方面,我也不方便上傳,不管如何,我從中獲取不少知識,先謝謝大家。謝謝!!




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