標題:
[發問]
如何建立只選取''非隱藏儲存格''的循環語句
[打印本頁]
作者:
HSINLI
時間:
2015-7-8 21:51
標題:
如何建立只選取''非隱藏儲存格''的循環語句
本帖最後由 HSINLI 於 2015-7-8 21:53 編輯
如題,程式碼見附件可以執行,但計算出來都不是想要的結果,
一一檢查發現好像是循環語句將篩選結果的“隱藏儲存格”的值也算進去了,但我只需要非隱藏儲存格的值;
自己有試過一些方法offset、resize...但無法解決,故想要來請教一下各位前輩,謝謝!
這程式主要目的是要將交易紀錄(工作表a)做整理,整理出非重複的項目,並計算各非重複項目現有的股數與成本
我的想法是:
先利用AdvancedFilter,將非重複的項目貼於另一工作表b
藉由工作表b有的項目,去利用循環語句一一篩選出工作表a裡該項目的重複項目
然後利用IF判斷是bought還是sold,bought為+,sold為-,再利用循環語句加總至工作表b的儲存格內
如果有更好的寫法就更感激了,謝謝!
Sub 現有交易部位整理()
Dim po As Worksheet
Dim 交 As Worksheet
Set po = Sheets("position")
Set 交 = Sheets("交易紀錄")
Application.ScreenUpdating = False
'過濾出所有重複的symbol,並將之貼至sheets("position")的a5處
交.Range("d:d").AdvancedFilter xlFilterInPlace, Range("d:d"), , True
交.Range("d:d").SpecialCells(xlCellTypeVisible).Copy po.Range("a5")
'刪除標題
po.Range("a5").EntireRow.Delete
'在Sheets("交易紀錄")篩選出在Sheets("交易紀錄")上的symbol,並加以計算QTY貼於Sheets("交易紀錄")
Dim i As Integer
Dim last As Integer
Dim ipo As Integer
Dim lastpo As Integer
lastpo = po.Range("a5").End(xlDown).Row
For ipo = 1 To lastpo
'利用貼至Sheets("position")的不重複物件,一一來篩選原表格所含有該物件的所有項目
交.ListObjects("表格1").Range.AutoFilter field:=4, Criteria1:=po.Range("a" & ipo)
'"想要"得到篩選出來項目的數目(不包括隱藏)
last = 交.Range("d2").End(xlDown).Row
For i = 1 To last
'如果在ACT.那格是bought的話qty得值為正,ACT.那格是Sold的話qty的值為負,循環加總至Sheets("position")對應的總量儲存格
If 交.Range("c" & i + 1) = "Bought" Then
po.Range("c" & ipo + 4) = po.Range("c" & ipo + 4) + 交.Range("e" & i)
ElseIf 交.Range("c" & i + 1) = "Sold" Then
po.Range("c" & ipo + 4) = po.Range("c" & ipo + 4) - 交.Range("e" & i)
End If
Next i
Next ipo
Application.ScreenUpdating = True
End Sub
複製代碼
[attach]21350[/attach]
作者:
GBKEE
時間:
2015-7-9 08:57
回復
1#
HSINLI
可修改如下
For i = 2 To 交.Range("d2").End(xlDown).Row
If 交.Range("c" & i).RowHeight Then 'RowHeight > 0 '儲存格不是隱藏的
If 交.Range("c" & i) = "Bought" Then
po.Range("c" & ipo) = po.Range("c" & ipo) + 交.Range("e" & i)
ElseIf 交.Range("c" & i) = "Sold" Then
po.Range("c" & ipo) = po.Range("c" & ipo) - 交.Range("e" & i)
End If
End If
Next i
複製代碼
也可如此
Option Explicit
Sub Ex()
Dim po As Worksheet, 交 As Worksheet
Dim ipo As Integer, Bought As Integer, Sold As Integer
Set po = Sheets("position")
Set 交 = Sheets("交易紀錄")
Application.ScreenUpdating = False
po.Range("a5", po.[A5].End(xlDown)) = ""
'AdvancedFilter xlFilterCopy 在指定的其他範圍的欄位(無字串,複製全部欄位。有字串,須為資料庫的欄位)
交.ListObjects("表格1").Range.Range("D:D").AdvancedFilter xlFilterCopy, , po.Range("a5"), True
'AdvancedFilter(進階篩選) ,AutoFilter(自動篩選)
'AdvancedFilter Action:= xlFilterInPlace 在篩選的範圍顯示篩選後的資料
With po
For ipo = 6 To .Range("a5").End(xlDown).Row '
交.ListObjects("表格1").Range.AutoFilter field:=4, Criteria1:=.Range("a" & ipo)
With 交.ListObjects("表格1").Range
.AutoFilter field:=3, Criteria1:="Bought"
Bought = Application.Sum(.Range("E:E").SpecialCells(xlCellTypeVisible))
'Application.Sum 工作表函數
'.SpecialCells [特殊的儲存格] (xlCellTypeVisible) 參數:=可見的儲存格
.AutoFilter field:=3, Criteria1:="Sold"
Sold = Application.Sum(.Range("E:E").SpecialCells(xlCellTypeVisible))
End With
.Cells(ipo, "C") = Bought - Sold
Next
End With
交.ListObjects("表格1").Range.AutoFilter '沒有準則 = 取消自動篩選
Application.ScreenUpdating = True
End Sub
複製代碼
作者:
HSINLI
時間:
2015-7-9 12:46
了解了!!
利用行高>0來篩選出非隱藏的儲存格
學到一課,謝謝指教!
g大的寫法晚上再慢慢研究!
還想再請問一下,
程式碼這部分的執行,常常在
po.Range("c" & ipo) = po.Range("c" & ipo) + 交.Range("e" & i)
這句出現“1004”'range'方法('_worksheet'物件)失敗
有時會發生有時又不會,不知是何種緣故?或哪裡需要改進?
For i = 2 To 交.Range("d2").End(xlDown).Row
If 交.Range("c" & i).RowHeight Then 'RowHeight > 0
If 交.Range("c" & i) = "Bought" Then
po.Range("c" & ipo) = po.Range("c" & ipo) + 交.Range("e" & i)
ElseIf 交.Range("c" & i) = "Sold" Then
po.Range("c" & ipo) = po.Range("c" & ipo) - 交.Range("e" & i)
End If
End If
Next i
複製代碼
作者:
HSINLI
時間:
2015-7-9 21:29
在這�堙耤�
作者:
GBKEE
時間:
2015-7-10 05:30
回復
4#
HSINLI
已找到附檔程式碼的錯誤如下
For i = 2 To 交.Range("d2").End(xlDown).Row
If 交.Range("c" & i).RowHeight Then 'RowHeight > 0 儲存格不是隱藏的
If 交.Range("c" & i) = "Bought" Then
'這錯誤 ipo沒有給值 ********
po.Range("c" & ipo) = po.Range("c" & ipo) + 交.Range("e" & i)
'***************************
ElseIf 交.Range("c" & i) = "Sold" Then
po.Range("c" & ipo) = po.Range("c" & ipo) - 交.Range("e" & i)
End If
End If
Next i
複製代碼
請將 If 交.Range("c" & i).RowHeight Then 'RowHeight > 0 儲存格不是隱藏的
套到你第一帖的程式碼試看看
作者:
HSINLI
時間:
2015-7-10 11:46
可以了!!謝謝g大
想請問如果發生這種錯誤的話,要怎麼找出問題在哪裡啊!?
想說以後自己先嘗試處理就好,不用麻煩您
作者:
GBKEE
時間:
2015-7-10 12:33
回復
6#
HSINLI
想請問如果發生這種錯誤的話,要怎麼找出問題在哪裡啊!?
待你VBA 的經驗值提升後,應可自行找出.
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)