Board logo

標題: [發問] (已解決)浮動區域的作業 [打印本頁]

作者: freeffly    時間: 2011-3-2 17:53     標題: (已解決)浮動區域的作業

本帖最後由 freeffly 於 2012-2-22 17:05 編輯

我想要問一下如附加檔那樣我的sum那各部份要怎麼設?
因為每各月整理出來的區域都不一樣
所以沒辦法固定區間
原本想到下面的方式
可是不可行
n 雖然是對的
可能我還缺哪各部份
請大大幫我看一下
謝謝


Sub Macro1()
'
' Macro1 Macro
' User 在 2011/3/2 錄製的巨集
'
    Dim 範圍 As Range, n As Integer
    Set 範圍 = Range("A" & Range("A65536").End(xlUp).Row)
    i = 範圍.CurrentRegion.Rows.Count - 1
    n = i * -1
     Range("H" & Range("A65536").End(xlUp).Row + 1) = "=sum(R[-1]C:R[n]C)"   
End Sub
作者: Hsieh    時間: 2011-3-2 18:22

回復 1# freeffly

看起來應該是對I/O欄位做分組小計
作者: GBKEE    時間: 2011-3-2 20:38

回復 1# freeffly
  1. Sub EX()
  2.     Dim R As Range, i As Integer
  3.     For Each R In Sheet3.Range("G5:G" & Rows.Count).SpecialCells(xlCellTypeConstants).Areas
  4.         R.Cells(R.Count + 1, 1) = "小計"
  5.         For i = 2 To 4
  6.              R.Cells(R.Count + 1, i) = "=sum(" & R.Offset(, i - 1).Address & ")"
  7.         Next
  8.     Next
  9. End Sub
複製代碼

作者: freeffly    時間: 2011-3-3 08:30

我只想對下面那塊區域做小計的動作
不過這各方法也是我想知道的
謝謝

如果只想對最下面的區域做小計動作
要做哪一各修改呢?
作者: oobird    時間: 2011-3-3 08:56

mrow = [g:g].Find("o", , , 1).Row
[g65536].End(3)(2).Resize(, 4) = Array("小計", "=sum(r" & mrow & "c:r[-1]c)", "=sum(r" & mrow & "c:r[-1]c)", "=rc[-2]/rc[-1]")
作者: freeffly    時間: 2011-3-3 12:17

回復 3# GBKEE


    Range("G5:G" & Rows.Count) 可以用Columns("G:G")取代嗎 這兩各方式有哪裡不同嗎?
    sum(" & R.Offset(, i - 1).Address & ")這種用法我不會耶可以解說一下嗎
作者: freeffly    時間: 2011-3-3 12:26

回復 5# oobird
我的資料基本上是計算"o"
但是第一塊區域也有可能含有"o"的部份(不列入計算的部份)
所以我原本想的方式是從第二塊區域去計算 並且計算第二塊區域的列數
不過還是從各位大大的方式看到自己沒用過的方式
可以問一下End(3)(2).Resize(, 4) 這各是什麼意思嗎?
作者: GBKEE    時間: 2011-3-3 14:33

本帖最後由 GBKEE 於 2011-3-3 14:39 編輯
回復  GBKEE
Range("G5:G" & Rows.Count) 可以用Columns("G:G")取代嗎 這兩各方式有哪裡不同嗎?
...
freeffly 發表於 2011/3/3 12:17

是可以用Columns("G:G")來取代的,但如g1:g3有數字 會失掉準確性
End(3)(2).Resize(, 4)=>.End(xlUp).Cells(2, 1).Resize(1, 4)
作者: Hsieh    時間: 2011-3-3 14:42

區塊既以空白列區隔
r = [A65536].End(xlUp).End(xlUp).Row
[A65536].End(xlUp).Offset(1, 6).Resize(, 4) = Array("小計", "=SUM(R" & r & "C:R[-1]C)", "=SUM(R" & r & "C:R[-1]C)", "=RC[-2]/RC[-1]")
作者: freeffly    時間: 2011-3-3 17:41

回復 9# Hsieh


    是的我要計算的區塊已經用空白列區隔
     所以是大大的簡單方式
     不過再這裡看到很多不一樣的處理方式
     真是還有的學
     謝謝喔
作者: freeffly    時間: 2011-3-3 17:43

回復 8# GBKEE

      了解
       那下面這各有辦法說明嗎 還是只能用背的?
     sum(" & R.Offset(, i - 1).Address & ")這種用法我不會耶可以解說一下嗎
作者: GBKEE    時間: 2011-3-3 19:48

本帖最後由 GBKEE 於 2011-3-3 19:53 編輯

回復 11# freeffly
這是vba的說明
expression.Offset(RowOffset, ColumnOffset)   
expression     必選。該運算式傳回 Range 物件。
RowOffset      選擇性的 Variant。用列數表示的區域位移 (正值、負數或零 (0))。正值表示向下位移,負值表示向上位移。預設值為 0。
ColumnOffset      選擇性的 Variant。用欄數表示的區域位移 (整數、負數或 0 (零))。正值表示右位移,負值表示左。預設值為 0。

expression.Address(RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo)
expression    必選。此運算式會傳回上述其中一個物件。
RowAbsolute    選擇性的 Variant。若為 True 則以絕對參照模式傳回對列的參照。預設值為 True。
ColumnAbsolute    選擇性的 Variant。若為 True 則以絕對參照模式傳回對欄的參照。預設值為 True。
ReferenceStyle    選擇性的 XlReferenceStyle 。
XlReferenceStyle 可以是這些 XlReferenceStyle 常數之一。
xlA1 預設值。使用xlA1 可傳回 A1 樣式的參照。
xlR1C1。使用 xlR1C1 可傳回 R1C1 樣式的參照。

External    選擇性的 Variant。若為 True 則傳回外部參照。若為 False 則傳回區域參照。預設值為 False。
RelativeTo    選擇性的 Variant。如果 RowAbsolute 和 ColumnAbsolute 為 False,且 ReferenceStyle 為 xlR1C1,則必須加入相對參照的起始點。本引數即為定義起始點的 Range 物件。

以下是我的說明''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
R.Offset(, 2)   ->R的範圍 向右移動2欄
R.Offset(1, 2) ->R的範圍 向右移動2欄 向下移動1列

R.Offset(, 2).Address     ->R的範圍 向右移動2欄的絕對位置
R.Offset(1, 2)).Address  ->R的範圍 向右移動2欄 向下移動1列的絕對位置
作者: freeffly    時間: 2011-3-4 08:28

回復 12# GBKEE


   謝謝
    有點看懂了
   主要是R的區域的移動加總
    可以這樣說嗎
作者: GBKEE    時間: 2011-3-4 08:40

回復 13# freeffly
對的
作者: freeffly    時間: 2011-3-6 18:47

回復 14# GBKEE


    謝謝
作者: FAlonso    時間: 2011-3-9 11:23

回復 1# freeffly
如果樓主有空的話,可否試試我這個作品,有錯的話請通知我讓我改正
  1. Sub abc()
  2. Dim myrange As Range, downlimit As Range, uplimit As Range, rightlimit As Range, myregion As Range
  3. Dim a, h, i

  4. Set myrange = Range("a65536").End(xlUp)

  5. Do
  6. Set downlimit = myrange
  7. Set uplimit = downlimit.End(xlUp)
  8. Set rightlimit = downlimit.End(xlToRight)
  9. Set myregion = Range(uplimit, rightlimit)

  10. h = 0
  11. i = 0

  12. For Each a In Range(uplimit, downlimit)
  13. If a.Offset(, 6) = "O" Then
  14.     h = h + a.Offset(, 7).Value
  15.     i = i + a.Offset(, 8).Value
  16. End If
  17. Next

  18. If h <> 0 Then
  19. downlimit.Offset(1, 6) = "小計"
  20. downlimit.Offset(1, 7) = h
  21. downlimit.Offset(1, 8) = i
  22. downlimit.Offset(1, 9) = h / i
  23. downlimit.Offset(1, 7).Interior.ColorIndex = 6
  24. downlimit.Offset(1, 8).Interior.ColorIndex = 6
  25. downlimit.Offset(1, 9).Interior.ColorIndex = 6
  26. End If

  27. Set myrange = uplimit.End(xlUp)
  28. Loop While myrange.Address <> "$A$1"
  29. End Sub
複製代碼

作者: freeffly    時間: 2011-3-9 17:47

回復 16# FAlonso


    我只要加總最後依區塊
      你的方式好像是針對"O"進行加總
      我剛看別的區塊加總好像有問題
      你的方式好像有點類似另一位大大但是又有些差異
      明天在告訴你差在哪裡
作者: FAlonso    時間: 2011-3-9 20:17

回復 17# freeffly
我猜想或許工作表中有很多區塊,當中一些又要對O作計算,所以寫成了loop
只對最下層區域作小計,把7/33/34行的程式刪掉便行
作者: freeffly    時間: 2011-3-11 12:26

回復 18# FAlonso


    檔案內我有說明
     請看檔案吧
作者: FAlonso    時間: 2011-3-11 13:33

回復 19# freeffly
把我的程式修改一下.變成
作者: FAlonso    時間: 2011-3-11 13:48

  1. Sub revisedprogram()

  2. Dim myrange As Range, downlimit As Range, uplimit As Range, rightlimit As Range, myregion As Range

  3. Dim a, H, i
  4. Set myrange = Range("a65536").End(xlUp)

  5. Set downlimit = myrange
  6. Set uplimit = downlimit.End(xlUp)
  7. Set rightlimit = downlimit.End(xlToRight)
  8. Set myregion = Range(uplimit, rightlimit)

  9. H = 0
  10. i = 0

  11. For Each a In Range(uplimit, downlimit)
  12. 'if a.offset(,5) = "??材料倉" and a.offset(,6) = "?" ? => 自己填入所需的篩選項
  13. H = H + a.Offset(, 7).Value
  14. i = i + a.Offset(, 8).Value
  15. 'end if
  16. Next

  17. downlimit.Offset(1, 6) = "小計"
  18. downlimit.Offset(1, 7) = H
  19. downlimit.Offset(1, 8) = i
  20. downlimit.Offset(1, 9) = H / i
  21. downlimit.Offset(1, 7).Interior.ColorIndex = 6
  22. downlimit.Offset(1, 8).Interior.ColorIndex = 6
  23. downlimit.Offset(1, 9).Interior.ColorIndex = 6

  24. End Sub
複製代碼
應該這樣吧,如果沒有事先篩選,把綠色字串最初的那個 ' 拿掉,輸入所需就行




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