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。如果 RowAbsoluteColumnAbsoluteFalse,且 ReferenceStylexlR1C1,則必須加入相對參照的起始點。本引數即為定義起始點的 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/)