返回列表 上一主題 發帖

請幫忙翻譯一下程式

回復 16# 198188
對函數(Find)用法不清楚時 , 可以自己先查詢Excel說明 ,
這樣可以更了解它的各參數用途 , 裡面也有例子可參考

Set FRng = Wb.Sheets("New form of payment report").Range("k:k").Find(Date, lookat:=xlWhole, SearchDirection:=xlPrevious)
這行只是 在K欄找到最後一筆符合Date的儲存格 ,
有找到 -> FRng設為該儲存格
沒找到 -> FRng = nothing
就只找一次而已

你要在每個符合Date的儲存格都另外判斷條件
可以參考 Excel說明的範例去改寫
範例 :
        這個範例會在第一張工作表上的 A1:A500 範圍內尋找值為 2 的所有儲存格,並將這些儲存格的值變更為 5。
  1. With Worksheets(1).Range("a1:a500")
  2.     Set c = .Find(2, lookin:=xlValues)
  3.     If Not c Is Nothing Then
  4.         firstAddress = c.Address
  5.         Do
  6.             c.Value = 5
  7.             Set c = .FindNext(c)
  8.         Loop While Not c Is Nothing And c.Address <> firstAddress
  9.     End If
  10. End With
複製代碼

TOP

本帖最後由 stillfish00 於 2012-12-12 00:57 編輯

回復 19# 198188
1. 你的code是放在哪個檔案?
2. 第22行:  Set Rng = Workbooks("outstanding payments").Sheets("outstanding payments").Range("a:a").Find(FRng.Offset(, -9), lookat:=xlWhole, SearchDirection:=xlPrevious)
     改outstanding payments.xlsm
3.  第26行:  With Workbooks.Open("outstanding payments.xlsm").Sheets("outstanding payments")
     改用完整路徑看看
4. 程式不如預期 , 可以學習下中斷點或逐行跑 , 搭配區域變數視窗&即時運算視窗 , debug會更有效率

TOP

本帖最後由 stillfish00 於 2012-12-12 11:07 編輯

回復 21# 198188
1. 程式放在outstanding payments.xlsm這個檔案
     表示  執行時outstanding payments.xlsm已經開啟
     那麼  26行 又用Workbooks.Open再開啟一次就沒有必要啦
3.  我原本的意思是改成With Workbooks.Open("C:\user\destop\outstanding payments.xlsm").Sheets("outstanding payments")
      但既然沒必要再開啟一次 ,
      改為With Workbooks("outstanding payments.xlsm").Sheets("outstanding payments")
      或省略為With Sheets("outstanding payments")就好了

同時要知道A.xlsx 和B.xlsx的最後一筆應該如何寫?
      寫法很多種 , 只舉例其中一種
      檔案已開啟的情況下A.xlsx的最後一筆
      With Workbooks("A.xlsx" ).Worksheets("Sheet1")    指定"A.xlsx"工作簿的"Sheet1"工作表
          Msgbox .Range("A" &  .rows.count).end(xlup).value
     End With
      A和B寫法是一模一樣 , 只是若你程式是寫在 A.xlsx 時
      Workbooks("A.xlsx" ).Worksheets("Sheet1")  可以省略成  Worksheets("Sheet1")
      Workbooks("B.xlsx" ).Worksheets("Sheet1")  則不能省略

如何讓電腦識別那句語法是使用那個excel的資料
      語法前的Workbooks("A.xlsx" )就是指定那個EXCEL
      如同你程式14行寫的Wb也是指定該EXCEL阿

TOP

回復 24# 198188
不是 , 應該是
    i =  Worksheets("Sheet1").Range("A" &  Worksheets("Sheet1").rows.count).end(xlup).value  + 1
或寫成
   with Worksheets("Sheet1")   
      i =  .Range("A" &  .rows.count).end(xlup).value  + 1
   end with   


另外 .value  是儲存格內的值
.row才是列號(第幾列)

TOP

回復 26# 198188
對的

TOP

回復 28# 198188
最簡單的方法就是15行底下加上ThisWorkbook.Activate ,
或你都改成寫 ThisWorkBook.Worksheets("New form of payment report") 也可以
因為 Workbooks.Open 會改變當前作用中的活頁簿
我寫了code測試
  1. 'Codes In a.xlsm
  2. Sub test()    Dim wb, fstr As String
  3.     fstr = "C:/b.xlsm"
  4.    
  5.     Set wb = Workbooks.Open(fstr)  
  6.     Debug.Print ThisWorkbook.Name         'will print a.xlsm
  7.     Debug.Print ActiveWorkbook.Name     'will print b.xlsm
  8.     Debug.Print Sheets.Parent.Name           'will print b.xlsm
  9.     wb.Close 0
  10. End Sub
複製代碼
我發覺我前面(#22)說的好像也不完全正確
不是以Code寫在哪來區別能不能省略
應該更正為:
使用WorkSheets/Sheets語法前面沒指定活頁簿時 ,
會自動使用當時Active的活頁簿底下的WorkSheet

TOP

        靜思自在 : 盡多少本份,就得多少本事。
返回列表 上一主題