Board logo

標題: [發問] 用迴圈判斷sheet名稱是否相同,並複製(已解決~感謝各位) [打印本頁]

作者: iceandy6150    時間: 2012-2-16 23:04     標題: 用迴圈判斷sheet名稱是否相同,並複製(已解決~感謝各位)

本帖最後由 iceandy6150 於 2012-2-22 21:54 編輯

我有兩個sheet,一個是<功能>,另一個是<1>
<1>裡面有設定按鈕,能統計裡面的資料,我要當樣本
<功能>裡面我設了一個textbox可以輸入數量,還有按鈕,按了會自動複製該數量的sheet加在<1>後面
               而且名稱自動增加<2>,<3>,<4>,......
可是寫不太出來,求助板上大大

Private Sub CommandButton1_Click()
    Dim E          '這是看別人寫的
    Dim a, b As String
    Dim c As Integer
b = textbox1.text   '抓數量過來,所以把b定義String

For a = 2 To b
      
    For Each E In Sheets
            If   E.Name = a   Then          '判斷目前檔案中所有sheet是否同名
              MsgBox (a + "重覆了")
              c = 1
              Exit For
            Else
              c = 0
             MsgBox (a+"未重覆可新增")
             Exit For
           End If
        Next
   
     If c = 0 Then
     Worksheets(a - 1).Copy after:=Worksheets(a - 1)
     ActiveSheet.Name = a
     End If
Next
End Sub

希望目標是a=2判斷一次,a=3判斷一次.......。一開始只有<1>很好新增
但若把數量從5改8,再按一次,照理說<1><2><3><4><5>會顯示重覆了,只新增<6><7><8>
不過好像跑不出來,迴圈好像也迴了好幾次 @_@"
作者: Hsieh    時間: 2012-2-16 23:44

回復 1# iceandy6150


Private Sub CommandButton1_Click()
If TextBox1 <> "" Then
For i = 1 To Val(TextBox1)
   With Sheets.Add(after:=Sheets(Sheets.Count))
   .Name = CStr(Sheets.Count)
   End With
Next
End If
End Sub
作者: iceandy6150    時間: 2012-2-17 00:04

回復  iceandy6150


Private Sub CommandButton1_Click()
If TextBox1  "" Then
For i = 1 To Val(T ...
Hsieh 發表於 2012-2-16 23:44


大大,你的方法可以新增.....輸入的數量的sheet
可是我要以<1>這個sheet為樣本,所有新增的都是複製<1>
另外是防呆功能
例如第一次輸入5 ----> 程式新增 <2><3><4><5>  (1原本就有)
但後來覺得5個不夠用,於是輸入8--->程式判斷1~5已經有了,不新增。6~8新增
(這樣1~5內的資料不會被動到)

謝謝
作者: Hsieh    時間: 2012-2-17 00:10

回復 3# iceandy6150
  1. Private Sub CommandButton1_Click()
  2. Application.ScreenUpdating = False
  3. If TextBox1 <> "" Then
  4. For i = 1 To Val(TextBox1) - Sheets.Count
  5.    Sheets(1).Copy after:=Sheets(Sheets.Count)
  6.    ActiveSheet.Name = CStr(Sheets.Count)
  7. Next
  8. End If
  9. Application.ScreenUpdating = True
  10. End Sub
複製代碼

作者: iceandy6150    時間: 2012-2-17 00:16

回復 4# Hsieh


    哇~太神奇了吧
雖然我看不太懂什麼意思
但是貼上程式後測試
ok耶~~~
太感謝你了~~:loveliness:

我知道的函數太少了,非常弱的新手一個:'(
作者: iceandy6150    時間: 2012-2-17 08:33

回復  iceandy6150
Hsieh 發表於 2012-2-17 00:10



    超級版主不好意思
今天測試發現一些小問題
用sheet.count是可以算出sheet的數目
但是我可能有<功能><命令>等sheet存在
例如我現有的sheet是 <功能><測試><命令><1>
如果textbox輸入4,那麼將不會動作,因為sheet數量有4個了
輸入5,會變成<功能><測試><命令><1><5>

目標是每次核對目前所有sheet的名稱是否有相同的
若有則不新增,若無才新增
而且新增時只新增純數字名稱的sheet
不會把其他非數字名稱的sheet算入

謝謝
作者: GBKEE    時間: 2012-2-17 09:20

回復 6# iceandy6150
  1. Option Explicit
  2. Sub Ex()
  3.     Dim xSH As Integer, Sh As Worksheet, xi As Integer, A As Integer
  4.     A = 6
  5.     For Each Sh In Sheets
  6.         If IsNumeric(Sh.Name) Then xSH = xSH + 1
  7.     Next
  8.     For xi = xSH + 1 To A
  9.         Sheets("1").Copy , Sheets(Sheets.Count)
  10.         Sheets(Sheets.Count).Name = xi
  11.     Next
  12. End Sub
複製代碼

作者: iceandy6150    時間: 2012-2-17 09:38

回復 7# GBKEE


    大大請問一下
你的程式要怎麼放?
我這樣放好像不能動... (我放在按鈕裡面)
Private Sub CommandButton2_Click()
Option Explicit
Sub Ex()
    Dim xSH As Integer, Sh As Worksheet, xi As Integer, A As Integer
    A = 6
    For Each Sh In Sheets
        If IsNumeric(Sh.Name) Then xSH = xSH + 1
    Next
    For xi = xSH + 1 To A
        Sheets("1").Copy , Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = xi
    Next
End Sub
End Sub
作者: iceandy6150    時間: 2012-2-17 09:45

版主大大~~我修改了一下,可以用了耶
好棒阿!!!!
Private Sub CommandButton2_Click()
   
    Dim xSH As Integer, Sh As Worksheet, xi As Integer, A As Integer
    A = Val(TextBox1)
    For Each Sh In Sheets
        If IsNumeric(Sh.Name) Then xSH = xSH + 1
    Next
    For xi = xSH + 1 To A
        Sheets("1").Copy , Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = xi
    Next

End Sub

感謝再感謝~~
作者: hugh0620    時間: 2012-2-17 10:06

樓主~
G大大或H大大都是很厲害的高手~

但站在SA的角度~ 其實還是會有一定的BUG存在
G大大的程式碼~ 當sheet.Name 不是出現的連續號碼~ 會產生錯誤
如 textbox1.text=6 執行後~
再隨便砍掉非sheet.name=6的任何一張sheet~ 再重新執行時~ 就會產生bug

若不考量已有的sheet是需要被保留的~ 建議保留基本的sheet~ 其他1,2,3...sheet 建議刪除後~
再重新跑出來~
例.每一次sheet1跑出的資料,都一樣~ 就可以用此方式
例.第一次跑出sheet1的資料與第二次跑出來的sheet1不一樣時~ 就不能這樣的方式~

樓主~  提供這些建議是因為有時使用者不是自己時~ 會產生不同的可能性~
在設計時~ 能盡量考量的完整~ 及結合一些預防可能發生的因素~
會讓你設計出來的工具能夠真正的被使用~
作者: GBKEE    時間: 2012-2-17 10:24

本帖最後由 GBKEE 於 2012-2-17 10:31 編輯

回復 8# iceandy6150
回復 10# hugh0620
  1. Private Sub CommandButton2_Click()
  2.     Dim xSH As Integer, Sh As Worksheet, xi As Integer, A As Integer
  3.     A = 6
  4.     For Each Sh In Sheets
  5.         If IsNumeric(Sh.Name) Then xSH = xSH + 1
  6.     Next
  7.     If xSH = 0 Then Exit Sub   '這裡 可除錯
  8.     For xi = xSH + 1 To A
  9.         Sheets("1").Copy , Sheets(Sheets.Count)
  10.         Sheets(Sheets.Count).Name = xi
  11.     Next
  12. End Sub
複製代碼

作者: Hsieh    時間: 2012-2-17 10:25

回復 10# hugh0620
取新增最大編號
  1. Private Sub CommandButton1_Click()
  2. Application.ScreenUpdating = False
  3. For Each sh In Sheets
  4.    If IsNumeric(sh.Name) Then s = CInt(sh.Name)
  5. Next
  6. k = Val(Sheets(1).TextBox1)
  7. If k > s Then
  8. For i = 1 To k - s
  9.   Sheets(1).Copy after:=Sheets(Sheets.Count)
  10.   ActiveSheet.Name = CStr(s + i)
  11. Next
  12. End If
  13. Application.ScreenUpdating = True
  14. End Sub
複製代碼

作者: iceandy6150    時間: 2012-2-17 10:44

本帖最後由 iceandy6150 於 2012-2-17 11:24 編輯

回復 10# hugh0620

你好,我目前的需求是,一個檔案裡面有一個sheet名稱只叫做1,(其實是購物清單1)
然後我要產生20份(textbox輸入),就會有20張購物清單,當然每張單的購物內容不一
例如生意好,要追加到30份,textbox輸入30,按鈕產生,前20張單必須保留不動,只新增21~30
所以才要寫防呆,避免手誤把前20份單給砍了。

現在我遇到一個問題,每日要產生日報表
我寫一個for去跑每張單(每個sheet)的每個品項看數量多少

假設每張單有10種產品
今天有20張單   textbox輸入20   要統計每種產品賣出多少
for i=1 to Val(TextBox1)
       t=t+worksheets(i).cells(1,1).value      <---這邊要怎麼指定名字為1的sheet。 worksheets(1)會變成檔案裡面第一個sheet,很可能是<功能>或<命令>
end for
我真的不太會了
作者: hugh0620    時間: 2012-2-17 12:37

回復 13# iceandy6150

    樓主大致上應該可以拼湊出來~ 你大概要結果~
    如果要依您原始的寫法~ 流程上大概就會是如下
    檔案儲存的方式
        採用一天一個FILE
   每個檔案的執行方式
    1.輸入
        1.1. 先行展開N個購物清單
        1.2. 依紙本購物清單一個一個輸入到每個SHEET
        1.3.  當購物清單有加追時~ 再去展開新增幾個SHEET
    2. 計算
        2.1 統計檔案中每一個SHEET的數量
     (職業病~ 比較會先從整個作業流程來思考後~ 再去設計適當的工具~ )
     (若覺不適用~ 想略過唷~~)
     若是依上述的方式在處理~ 個人會比較建議改變流程
     思考點:  
          若資料是一張張紙本資料輸入到EXCEL的話
          不建議用展開SHEET的方式來處理
          建議:設計一個物件表單來處理~ 反而會更適合
          如下圖的方式
          [attach]9625[/attach]
作者: iceandy6150    時間: 2012-2-17 14:16

回復 14# hugh0620

因為檔案需要用EXCEL去計算,每日要印日報表,還有上中下旬報表(1~10、11~20、21~30),月報表
品項可能高達60項,每個月品項多少會更動。比如編號1是黑松汽水,下個月可能改乖乖
用sheet的話,使用者只需要改字,旬報和月報的名稱、單價等可以用 ='1'!C3 這種方式連帶更動

所以 1日.xls檔案中可能有20張單,2日.xls可能有30張單....以此類推
因為不想固定每天都50個sheet,才想說能不能用新增的功能

每張單(sheet)依購買者資料輸入各品項的數量,例如乖乖6包,汽水5罐,...等
再列印出來 (類似發票系統,只會印出購買者有買的物品,沒買的不印) 。這部分我ok

接下來是計算日報表
如何把sheet的名稱用變數去指定,研究不出來

sheet名稱為1的品項1的數量+<2>的品項1的數量+<3>的品項1的數量+.....+到最後一張單
設i=1   sheet(i)會是檔案中第一個sheet,而不是檔案中名稱為1的sheet

卡在這裡......>"<
作者: Hsieh    時間: 2012-2-17 14:35

回復 15# iceandy6150
將銷售細目以資料庫型態儲存才是正道
若你一定要將每張銷售單做成一個工作表,在統計上會很麻煩
當然你的方法去找每張工作表然後找到品名與數量後去統計當然也行,不過這樣不是浪費很多空間與時間嗎?
至於你說的工作表名稱是數字時要如何指定
就是將數字轉成字串
例如
for i=1 to 5
sheets(cstr(i)).select
next
作者: iceandy6150    時間: 2012-2-17 15:06

回復 16# Hsieh


    感謝您的解答

因為我是幫忙改良,使用者是中年以上的歐巴桑了
太難的東西怕她不會用,她也習慣舊的方式了
不然資料庫的確是好物
(看她舊的做法純粹用EXCEL去指定然後加減乘除,檔案大得不得了,又容易出錯)

很謝謝大家熱心解答喔!




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