『マクロ四角形』(4949) Excel2003 WindowsXP メニューというシートに四角形を100個くらい作成し一つ一つに数式バーにて リンクを持たせてます。式は  =個人データ!L11  なのですがL11〜L70までは氏名 が入ってますので四角形には氏名が表示されます。 しかしL71から以降はまだ氏名が入ってないので#N/Aと表示されます。 そこでIF関数を使用しようと思いまして =IF(個人データ!L11="","",個人データ!L11) としても入力したシートは正しくありません。と出てきます。OKをクリックすると IFが点滅してます。どこがいけないのでしょうか? 分かる方お願いします。 リンク先は個人データという名前のシートです。 ---- 普通に  オートシェイプで四角形を描いて  選択した状態で 数式バーに「=個人データ!L11」を入れた って事ですよね? ハイパーリンク とか言う事ではなく。 個人データシートのL11が「#N/A」になっているから それが表示されているのでは? どこかのセルに↓の式をいれて、結果を確認してみて下さい。 =ISNA(個人データ!L11) TRUEですか?FALSEですか? (HANA) ---- =ISNA(個人データ!L11) を入力するとFALSEになりました。 >個人データシートのL11が「#N/A」になっているから 確かに#N/Aになってます。 ここはINDEX関数とMATCHを使用してまして#N/Aが出てます。 ---- あれれ?L11が#N/Aに成っているなら ISNA関数の戻り値は TRUE になるハズですが。。。 まぁ、↓のシートなんでしょうね? [[20110831142407]] 『データーベースからの抽出』(4949) エラー処理を入れて、#N/Aを出ないようにしておくのが良いと思います。 過去ログの続きであれば =IF(COUNTIF(Sheet1!$H:$H,$G2)ハイパーリンク関数で、セルから直接リンクさせることにすると >設定も簡単なのかと思いました。 というのは四角を100個も作成せずにセルにハイパーリンク関数を入れて  って事ですよね? 確かに今sheet1に個人情報を入力して数字を変えてもオプションの計算方法は自動 になってるのに変更されなかったり情報が変更されなかったりしてて 容量が大きすぎるのかな?と思ってました。 そちらのほうがよいと私も思いますが、 ハイパーリンク関数でもsheet1 からの情報で雇用区分別に認識してくれますか? あまり使用したことがないもので。。。。  (4949) ---- >H列では認識しなかったんだと思いますけど、、、 そうなんです!! そちらのシートの状況が、私に見えていませんでした。 エラー部分の表示が無くなる仕組みが、分かって頂けたでしょうか? >四角を100個も作成せずにセルにハイパーリンク関数を入れてって事ですよね? はい、そのつもりですが。 数式自体は増えるので、計算スピードが上がるかどうかは分からないですね。 >sheet1からの情報で雇用区分別に認識してくれますか? 一旦Sheet2に振り分けて表示が必要なんですよね? >正社員は11から100までシートを作成し という事ですが、具体的にシート名はどの様に成っていますか? (HANA) ---- >エラー部分の表示が無くなる仕組みが、分かって頂けたでしょうか? なるほど。。。と思いました。 >一旦Sheet2に振り分けて表示が必要なんですよね? sheet2に雇用区分別に振り分けは必要になります。 sheet1は雇用区分がランダムなのでそれを一端sheet2へ雇用区分別に整理してからの作業をしてます。 >正社員は11から100までシートを作成し >という事ですが、具体的にシート名はどの様に成っていますか? シート名はそのまま数字を使用してます。 正社員の11ならばシート名は11です。 正社員の100ならばシート名は100です。 シートや関数やマクロがありすぎて最新で容量が10MBになってしまいました。 ユーザーフォームも入ってるのですが容量を結構使いますか? 少しでも軽く出来たら。。。と思います。 よろしくお願いします。 (4949) ---- >なるほど。。。と思いました。 それは良かったです。 この「なるほど」の積み重ねは重要だと思います。 話は戻って 結局、シートは何枚あるのですか? Sheet1とSheet2と正社員の11〜100 と。。。? そして、Sheet1にデータを貼り付けたら、その月(?)に 個人用シートが何枚必要かは決まると思います。 使わないシートは削除しますか? それとも、途中で増える(Sheet1のデータの下に追加する?)場合 或いはその他の事情で、空のシートもすべてそのままにしておくのでしょうか? まずは何処で容量が大きく成っているのか 関数やシートを削除しながら 確認してみられてはどうでしょう? 簡単な所だと、まず関数がすべて無かった場合。 それから、関数は入れておいて 各シートが無かった場合。 関数もシートもあって、ユーザーフォームが無かった場合。  ブックを複製して 見比べてみて貰えると良いかもしれません。 既にマクロが使われているブックなら Sheet2へ振り分けるのも、マクロでやってしまって良いと思います。 それをやったら容量がどのくらい減るかを確認するのが先ですが。 (HANA) ---- シートは現在235シートあります。 sheet2に雇用区分別に振り分けてますので 正社員で90人 契約社員40人 パート40人 アルバイト10人 この時点で180人分の勤務表があります。 かつ日々入力用としまして31日分シートがあります。 あとはマスター関係 集計表 合計235シートです。。。 >そして、Sheet1にデータを貼り付けたら、その月(?)に >個人用シートが何枚必要かは決まると思います。 >使わないシートは削除しますか? >それとも、途中で増える(Sheet1のデータの下に追加する?)場合 >或いはその他の事情で、空のシートもすべてそのままにしておくのでしょうか? 使わないシートも作成してまして増えるであろう予測で多めに作成してます。 これは削除すると増える場合困るのでそのままにしておきます。 >既にマクロが使われているブックなら >Sheet2へ振り分けるのも、マクロでやってしまって良いと思います。 可能ですか? 関数よりマクロが軽いのであればそちらが魅力的です。 >簡単な所だと、まず関数がすべて無かった場合。 >それから、関数は入れておいて 各シートが無かった場合。 >関数もシートもあって、ユーザーフォームが無かった場合。 >ブックを複製して 見比べてみて貰えると良いかもしれません。. これからやってみます。 (4949) ----  やはり複製してみましたが必要な関数は残して、ユーザーフォーム削除しましたがそんなに変化 がなく困ってます。 完成までいってなかったのでやや完成に近づけてシートを少し減らして作成しましたが 15MBになりました。 エクセル作成は難しいでしょうか? 皆さんは勤務表を作成してもそんなに容量はいってないのでしょうか? (4949) ---- 運用実績はまだ無いのですね? 皆さんはどうなさっているのでしょうね。 分かりませんが、おそらくその様な管理をしていないか エクセル以外で管理をしているか。。。我慢して使っているか・・・。 今まで人数分の用紙に記入をして、電卓等で計算をしていたのを そのままエクセルで置き換えた と言う事なら、発想の転換が必要かもしれません。 個人のシートにどの様な情報が必要なのか分からないので なんとも言えませんが 簡単で、おそらく共通のイメージがつきやすい「請求書」を例にして話を書いてみます。 月に一回、取引先毎の金額合計一覧表と、取引先に請求書を発行するのが仕事です。 取引先は、A社,B社,C社 の3社が有ります。 =============================================================================== 一つのブックにシートを4枚作成。 Sheet1 ・・・ 取引金額合計一覧表 Sheet2 ・・・ A社用請求書 Sheet3 ・・・ B社用請求書 Sheet4 ・・・ C社用請求書 Sheet2の A社用請求書は [A] [B] [C] [D] [E] [1] [2] A社 御中 [3] [4] 合計金額 消費税 当月ご請求額 [5] 1,400 70 1,470 [6] [7] 日付 商品名 数量 単価 金額 [8] 9月1日 りんご 3 100 300 [9] 9月5日 みかん 10 30 300 [10] 9月13日 りんご 5 100 500 [11] 9月20日 ばなな 2 150 300 [12] [13] こんな感じで、印刷用の罫線や書式等は設定済み A8:D11に取引が有ったデータを入力して行き その他の部分は文字或いは数式が入力済み。 Sheet3,Sheet4 も同様の作りで、取引先名が違うのと もちろん内容も違うが その他の部分(書式設定や、数式等)は同じ。 Sheet1の一覧表には、単純に各シートのC5セルの値を参照させる。 =============================================================================== こんな作りのブックにしてあったら、取引先が100社有ったら 100+1枚シートが必要に成ります。 しかも、エクセルで処理している利点は  ・数量と単価をを入力したら、自動で金額が合計される  ・手書きの文字より印刷の方が綺麗 程度でしょうか。。。 以下、もう少しエクセルっぽい作り。 =============================================================================== 一つのブックにシートを3枚作成。 Sheet1 ・・・ 取引金額合計一覧表 Sheet2 ・・・ 請求書フォーム Sheet3 ・・・ データ Sheet2は、先ほどのSheet2の内 A8:D11に何も入力が無いもの。 Sheet3は、 [A] [B] [C] [D] [E] [1] 取引先 日付 商品名 数量 単価 [2] A社 9月1日 りんご 3 100 [3] A社 9月5日 みかん 10 30 [4] B社 9月13日 りんご 5 100 [5] C社 9月20日 ばなな 2 150 [6] [7] こんな感じで、データのみが入っているシート。 データが一か所に集まっていたら、ピボットテーブルで集計が出来ます。(Sheet1) また、ワードの差し込み印刷の様に簡単には行きませんが 印刷が必要な時は データシートから、データを抽出して1社ずつ印刷します。(Sheet2)  差し込み印刷なら、ワードにやらせても良いでしょうし。 =============================================================================== 取引先が増えた場合は、Sheet3のデータ量は増えると思いますが、シート数は増えません。 個人用のシートが100枚以上有る様なので、こんなに単純にはいかないのかもしれませんが。。。 ユーザーフォームを作っておられたという事は、マクロの使用も検討に入れれば良いと思います。 すると、少々の無理ならきくようになると思います。 データ量が多く成る様なら、エクセルでやりきるのもまた難しくなるかもしれませんが。 個人用のシートをそのまま持っておく必要が有るなら、  ・個人用のシートに数式が入っている場合は、それもマクロ化を検討  ・最悪 ブックを分ける 等、考えてみても良いかもしれません。 ブックを分ける場合は、その後の扱い方も視野に入れながら検討が必要になるとは思いますが。 (HANA) ---- >個人用のシートをそのまま持っておく必要が有るなら、  >・個人用のシートに数式が入っている場合は、それもマクロ化を検討 持っておく必要が有ります。 マクロでの検討はやってみようと思いますけど、どのように進めていったらいいでしょうか? よろしくお願いします。 ---- と言われましても、どの様な数式なのかわからないですし。。。 最終的にはチェンジイベントを使う事になるのではないかと思いますが。 まずは、各シートの数式を消したら軽くなるのかの確認が必要でしょうね。 >>簡単な所だと、まず関数がすべて無かった場合。 これの確認は 前回やりましたか? 『コードを作って置き換えたは良いが 関数以外の所で大きく、結果は変わらなかった。』 と成ったのでは仕様がありませんので。 (HANA) ---- >各シートの数式を消したら軽くなるのかの確認が必要でしょうね。 必要な関数は残して一点に絞り関数削除しましたら16.4MBあったのが8.88MBになりました。 やはりマクロでやってみたいです。 説明させていただきます。 多少シート数を減らしたので 正社員のシート名   11〜70=60シート 契約社員Aのシート名 101〜130=30シート 契約社員Bのシート名 201〜210=10シート パートAのシート名  301〜310=10シート パートBのシート名  501〜525=25シート アルバイトAのシート名  401〜405=5シート アルバイトBのシート名  601〜605=5シート ここだけで145シートあります。 16日〜15日の日々入力勤務表が31シートあります。 この16日〜15日の日々勤務表の入力した数字を雇用区分別のシート(個人別145シートへ) 関数を使ってました。145シートへの集計をマクロで可能でしょうか? <日々勤務表31シート>   F    H    K  L   M   N ・・・Z   AA AB AD AF・・・AN 始業時間 終業時間 1直 時差 2直 変2直     勤務時間 早出残業 深夜時間 遅早私 8:30 18:15 ○ 7.75  1.00 <個人別勤務表145シート>   E    H    I  J   K   L ・・・X  Y Z AB AD・・・AL 始業時間 終業時間 1直 時差 2直 変2直     勤務時間 早出残業 深夜時間 遅早私 8:30 18:15 ○ 7.75  1.00 個人別勤務表は10行目から40行目まであり 10行目は16日 11行目は17日 12行目は18日 となってます。 日々勤務表は11行目から155行まであり 11行目から正社員 71行目から契約社員A 101行目から契約社員B 111行目からパートA 121行目からパートB 146行目からアルバイトA 151行目からアルバイトB 日々勤務表11行目は個人別勤務表のシート名11の10行目に集計される 日々勤務表12行目は個人別勤務表のシート名12の10行目に集計される 日々勤務表71行目は個人別勤務表のシート名101の10行目に集計される 日々勤務表101行目は個人別勤務表のシート名201の10行目に集計される 日々勤務表111行目は個人別勤務表のシート名301の10行目に集計される 日々勤務表121行目は個人別勤務表のシート名501の10行目に集計される 日々勤務表146行目は個人別勤務表のシート名401の10行目に集計される 日々勤務表151行目は個人別勤務表のシート名601の10行目に集計される と長々と書かせていただきました。 ちょっと複雑に作成してしまったかもしれませんが。。。 アドバイスよろしくおねがいします。 ---- あぁ、貴方でしたか。 マクロでやるとして、入力時に転記すると成ると マクロ実行のタイミングが難しいですね。 アクティブにした個人シートのデータをそのタイミングで更新するので良いなら たとえば、ThisWorkbook モジュールに '------ Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim tbl(1 To 31, 1 To 34) Dim ShNum As Long, TarRow As Long Dim i As Long If 11 <= ActiveSheet.Name And ActiveSheet.Name <= 605 Then ShNum = ActiveSheet.Name Select Case ShNum Case Is <= 100 TarRow = ShNum Case Is <= 200 TarRow = ShNum - 30 Case Is <= 300 TarRow = ShNum - 100 Case Is <= 400 TarRow = ShNum - 190 Case Is <= 500 TarRow = ShNum - 255 Case Is <= 600 TarRow = ShNum - 380 Case Else TarRow = ShNum - 450 End Select For i = 1 To 31 If Range("A" & i + 9).Value <> "" Then With Sheets(Range("A" & i + 9).Value) tbl(i, 1) = .Range("F" & TarRow).Value tbl(i, 4) = .Range("H" & TarRow).Value tbl(i, 5) = .Range("K" & TarRow).Value tbl(i, 6) = .Range("L" & TarRow).Value tbl(i, 7) = .Range("M" & TarRow).Value tbl(i, 8) = .Range("N" & TarRow).Value tbl(i, 20) = .Range("Z" & TarRow).Value tbl(i, 21) = .Range("AA" & TarRow).Value tbl(i, 22) = .Range("AB" & TarRow).Value tbl(i, 24) = .Range("AD" & TarRow).Value tbl(i, 26) = .Range("AF" & TarRow).Value tbl(i, 34) = .Range("AN" & TarRow).Value End With End If Next Range("E10").Resize(UBound(tbl, 1), UBound(tbl, 2)).Value = tbl End If End Sub '------ 個人用のシートのA列には、データを参照するシート名(日々勤務表シート)と 同じ文字が入力されている事を想定しています。 (HANA) ---- >個人用のシートのA列には、データを参照するシート名(日々勤務表シート)と >同じ文字が入力されている事を想定しています。 ですけど、個人用シートのA列は実際空白なのですが。。。 個人用のシートのA列とデータを参照するシート名(日々勤務表シート)のA列に同じ 文字ということですか? 行ではだめですよね?。。。 >If Range("A" & i + 9).Value <> "" Then > With Sheets(Range("A" & i + 9).Value)       ↑           ↑ ここの部分だと思うのですが。。。 (4949) ---- >個人用のシートのA列とデータを参照するシート名(日々勤務表シート)のA列に同じ >文字ということですか? いや、少し違います。不明点が多いので、まずは仮の状態のコードに成っています。 たぶん、個人用のシートのどこかの列に カレンダーの様な 日付が入っている列が有ると思いますが。。。実際はそれが利用出来ると思います。   それは何処の列で、どの様に日付が入っていますか?   文字で 1日 2日 3日? 数式で? それから、日々勤務シートのシート名が良く分からないので 「16日」「17日」「18日」・・・・と成っていると想定した場合   あまり長い名前にしていると思えませんが、どの様にしていますか? 個人用のシートのA列の該当の行に 16日,17日,18日・・・と 入力しておいて下さい。 で、これに関する情報を教えていただければと思います。 (HANA) ---- 個人用シートのC列10行目から40行目まであります。 日付は8/16 8/17と表示してありユーザー定義の m/dd;@ にしてあります。 個人個人休みが違うのでこれは別シートにて休みの日には※8/16※をいれて 出勤日は8/17 として日付をHLOOKUP関数にて持ってきてます。 >それから、日々勤務シートのシート名が良く分からないので >「16日」「17日」「18日」・・・・と成っていると想定した場合 16日 17日 としてあります。 よろしくお願いします。 (4949) ---- でしたら、今有るコードは削除して、同じ場所に↓で試してみて下さい。 '------ Private Sub Workbook_SheetActivate(ByVal Sh As Object) '============================================= '集計(Totl)追加 2011/09/26 '============================================= Dim tbl(1 To 31, 1 To 34) Dim Totl(1 To 1, 1 To 34) Dim ShNum As Long, TarRow As Long Dim i As Long If 11 <= Sh.Name And Sh.Name <= 605 Then ShNum = Sh.Name If 11 <= ShNum And ShNum <= 70 Then '正社員 TarRow = ShNum ElseIf 101 <= ShNum And ShNum <= 130 Then '契約社員A TarRow = ShNum - 30 ElseIf 201 <= ShNum And ShNum <= 210 Then '契約社員B TarRow = ShNum - 100 ElseIf 301 <= ShNum And ShNum <= 310 Then 'パートA TarRow = ShNum - 190 ElseIf 501 <= ShNum And ShNum <= 525 Then 'パートB TarRow = ShNum - 255 ElseIf 401 <= ShNum And ShNum <= 405 Then 'アルバイトA TarRow = ShNum - 380 ElseIf 601 <= ShNum And ShNum <= 605 Then 'アルバイトB TarRow = ShNum - 450 End If For i = 1 To 31 If Range("C" & i + 9).Value <> "" Then With Sheets(Format(Replace(Range("C" & i + 9).Value, "※", ""), "d日")) tbl(i, 1) = .Range("F" & TarRow).Value 'E 始業時間 tbl(i, 4) = .Range("H" & TarRow).Value 'H 終業時間 tbl(i, 5) = .Range("K" & TarRow).Value 'I 1直 tbl(i, 6) = .Range("L" & TarRow).Value 'J 時差 tbl(i, 7) = .Range("M" & TarRow).Value 'K 2直 tbl(i, 8) = .Range("N" & TarRow).Value 'L 変2直 tbl(i, 20) = .Range("Z" & TarRow).Value 'X tbl(i, 21) = .Range("AA" & TarRow).Value 'Y 勤務時間 tbl(i, 22) = .Range("AB" & TarRow).Value 'Z 早出残業 tbl(i, 24) = .Range("AD" & TarRow).Value 'AB 深夜時間 tbl(i, 26) = .Range("AF" & TarRow).Value 'AD 遅早私 tbl(i, 34) = .Range("AN" & TarRow).Value 'AL End With If tbl(i, 5) <> "" Then Totl(1, 5) = Totl(1, 5) + 1 'I 1直 If tbl(i, 6) <> "" Then Totl(1, 6) = Totl(1, 6) + 1 'J 時差 If tbl(i, 7) <> "" Then Totl(1, 7) = Totl(1, 7) + 1 'K 2直 If tbl(i, 8) <> "" Then Totl(1, 8) = Totl(1, 8) + 1 'L 変2直 Totl(1, 21) = Totl(1, 21) + Val(tbl(i, 21)) 'Y 勤務時間 Totl(1, 22) = Totl(1, 22) + Val(tbl(i, 22)) 'Z 早出残業直 Totl(1, 24) = Totl(1, 24) + Val(tbl(i, 24)) 'AB 深夜時間 Totl(1, 26) = Totl(1, 26) + Val(tbl(i, 26)) 'AD 遅早私 End If Next Range("E10").Resize(UBound(tbl, 1), UBound(tbl, 2)).Value = tbl Range("E41").Resize(UBound(Totl, 1), UBound(Totl, 2)).Value = Totl End If End Sub '------ 日付を参照する部分も、数式で無く出来そうですね。 (HANA) ---- 解読しようと思い、わからない部分をいくつか質問させていただきます。 @ >Dim tbl(1 To 31, 1 To 34)       ↑   ↑     1 To 31 この部分は日々勤務表が31シートあるので 1 To 31 ですよね?     1 To 34の34とは何ですか? A >For i = 1 To 18         ↑        18とは何ですか? B >If Range("C" & i + 9).Value <> "" Then       ↑   ↑       ↑  i + 9は個人の勤務表が10行目から始まっているので。。。ですか?       ↑     個人の勤務表日付の列ですよね?BCDの連結でした。    ということはBでOKですか? C           >With Sheets(Format(Replace(Range("C" & i + 9).Value, "※", ""), "d日"))                                   ↑ もしかしてd列に日が入ってると想定していただいたのですか?実際はBCD連結なの ですが。。。 (私のド素人の発想。。。ですけど) D >tbl(i, 1) = .Range("F" & TarRow).Value 〜〜〜〜〜  〜〜〜〜〜〜〜〜〜〜〜〜〜 こちらが個人勤務表? = こちらが日々勤務表? tbl(i, 1)        .Range("F" & TarRow).Value     ↑            ↑    1とはなぜ1なのですか?  日々勤務表の始業時間の列? E >tbl(i, 4) = .Range("H" & TarRow).Value これはDの質問でFが1ならばHは3と思ったのですか4だしKも5なので私は全く 理解してないですね。。。 たくさん質問してしまいました。 すいませんが、よろしくお願いします。 (4949)     ---- すみませんが、あまり時間が無いので 簡単に。。。 >(1)Dim tbl(1 To 31, 1 To 34) > 1 To 34の34とは何ですか? 個人別勤務表の各列の説明が   E    H    I  J   K   L ・・・X  Y Z AB AD・・・AL と成っていたので、E列を 1番,F列を2番・・・と数えて行き、AL列が34番目の列 と言う値に成ります。 > 1 To 31 この部分は日々勤務表が31シートあるので 1 To 31 ですよね? に関しては、お考えの通りです。 31行×34列 の升目の入ったスペースが有ると想像して下さい。 このスペースの名前は tbl と言う名前です。   イメージとしては、     シート名が tbl と言うシートが有って     そのシートには、31行×34列の範囲にだけ何か記入が出来る   といった感じです。 >(2)For i = 1 To 18 > 18とは何ですか? すみません、テスト時の値から変更して載せるのを忘れていました。 31にして下さい。 >(3)If Range("C" & i + 9).Value <> "" Then > BCDの連結でした。ということはBでOKですか? はい、Bでやってみて下さい。 > i + 9は個人の勤務表が10行目から始まっているので。。。ですか? その通りです。 >(4)With Sheets(Format(Replace(Range("C" & i + 9).Value, "※", ""), "d日")) > もしかしてd列に日が入ってると想定していただいたのですか? Formatの部分は、ワークシート関数の TEXT関数 Replaceの部分は、SUBSTITUTE関数を想像して下さい。 例えば、A1セルに 2011/9/1 と入っている場合 =TEXT(A1,"d日") の結果は 1日 と言う文字列に成ります。 日々勤務表のシート名を特定する部分です。 >(5)tbl(i, 1) = .Range("F" & TarRow).Value > こちらが個人勤務表? = こちらが日々勤務表? そうです。右辺のRange の前には「.」が付いていますので、With の続きに書いて有りますが Sheets(Format(Replace(Range("C" & i + 9).Value, "※", ""), "d日")) のシート名の ("F" & TarRow)セルの事です。 > tbl(i, 1) 1とはなぜ1なのですか? tblと言う名前の変数は 31行×34列 の升目で区切られていますが それの 1列目 の事です。 最後に Range("E10").Resize(UBound(tbl, 1), UBound(tbl, 2)).Value = tbl E10セルを先頭に、この内容を書き出すので、tbl(1,1) が E10 の位置にあたります。 > .Range("F" & TarRow).Value 日々勤務表の始業時間の列? そうです。日々勤務表のF列の値を、個人勤務表のE列に転記しますね? >(6)tbl(i, 4) = .Range("H" & TarRow).Value E列を1番として、番号を数えているからです。 個人勤務表の E列(E列から数えて1列目) に 日々勤務表の F列の値を転記 個人勤務表の H列(E列から数えて4列目) に 日々勤務表の H列の値を転記 ~ 行方向も同様です。ワークシート上の10行目がtblの1行目にあたります。 言葉足らずに成っていると思います(誤字脱字説明違いも有るかもしれません)が、宜しくお願いします。 また分からない部分を書いておいてもらえると良いと思います。 (HANA) ---- >If 11 <= ShNum And ShNum <= 70 Then '正社員     >TarRow = ShNum   >ElseIf 101 <= ShNum And ShNum <= 130 Then '契約社員A     >TarRow = ShNum - 30      ← -30の意味を教えてください   >ElseIf 201 <= ShNum And ShNum <= 210 Then '契約社員B     >TarRow = ShNum - 100 ←      -100の意味を教えてください 追加で作成しやってみましたが501のところが反映されません。 501以外は反映されましたが。。。。 またまたよろしくお願いします。 (4949) ---- 例えば >71行目から契約社員A >日々勤務表71行目は個人別勤務表のシート名101の10行目に集計される なので、アクティブになったシート(個人勤務表)のシート名が 101 だった場合 日々勤務表は 101-30=71行目のデータが該当です。 本当はもっと汎用的な書き方が出来るのが良いと思いますが。 (HANA) ---- この説明ですごくわかりました。 >ElseIf 501 <= ShNum And ShNum <= 525 Then 'パートB >TarRow = ShNum - 255 ← -380 >ElseIf 401 <= ShNum And ShNum <= 405 Then 'アルバイトA >TarRow = ShNum - 380 ← -255 にて501が反映されました。 なかなか奥が深いですがマクロは何でも出来る見たいですね。 HANAさんありがとうございました。 ---- そうですね。マクロを使うと出来る事が格段に増えます。 Sheet1からSheet2に関数で振り分けて それを個人シートに関数で参照して 日付部分も関数で参照してますよね? この作業はご自身の意志で実行すれば良いと思いますので これを、ボタンで実行するマクロに変えてはどうでしょう。 関数部分が減らせると思います。 その前に。。。日々勤務表のWorksheet_Changeのコードは ThisWorkbookに移動出来ましたか? それが出来たら、AA列〜に入っている関数も 【設定しておかない】様に出来るのではないかと思います。 それとも、個人シートの転記後のに再計算される部分があるなら もう少し一連のコードとして追加しておいても良いかもしれないです。 どこかに、合計する関数とか、カウントする関数とか 入っているのではないかと思いますが。 (HANA) ---- >その前に。。。日々勤務表のWorksheet_Changeのコードは >ThisWorkbookに移動出来ましたか? Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) にて移動できました。 結果報告してませんでしたね。すいません。 >それが出来たら、AA列〜に入っている関数も >【設定しておかない】様に出来るのではないかと思います。 これは日々勤務表のことですよね?。。 日々勤務表はAA11列からはAN155列はユーザーフォームを復活させてますけど。。。 しかし >それとも、個人シートの転記後のに再計算される部分があるなら >もう少し一連のコードとして追加しておいても良いかもしれないです。 >どこかに、合計する関数とか、カウントする関数とか 入っているのではないかと思いますが。 個人シートへの転記後で再計算される部分といったら合計する関数とか、カウントする関数が 日々勤務表はK157からAN157の行に合計欄の照合でありますし個人勤務表にもI41からAL41はあります。 >Sheet1からSheet2に関数で振り分けて >それを個人シートに関数で参照して >日付部分も関数で参照してますよね? 全くその通りです。 >この作業はご自身の意志で実行すれば良いと思いますので ←私もそのほうが良いです。 >これを、ボタンで実行するマクロに変えてはどうでしょう。 >関数部分が減らせると思います。 これは日付部分をマクロに。。ですか? それとも >Sheet1からSheet2に関数で振り分けて  をマクロで、 かつ日付部分もマクロで出来る??のですか??? 可能なのでしたらすごくやってみたいですけど。。。 (4949) ---- >個人シートへの転記後で再計算される部分といったら合計する関数とか、カウントする関数が >・・・・・ >個人勤務表にもI41からAL41はあります。 って事なので、まずはこちらから。。。 具体的に、どのセルにどの式が入って居ますか? (HANA) ---- >個人シートへの転記後で再計算される部分といったら合計する関数とか、カウントする関数が >日々勤務表はK157からAN157の行に合計欄の照合でありますし個人勤務表にもI41からAL41はあります。 <日々勤務表> K157からZ157は K157=SUBTOTAL(3,K11:K155)と入れてありますけど K157=COUNTIF(K11:K155,"○")+COUNTIF(W11:W155,"●")+COUNTIF(W11:W155,"◆")どちらか。 K157以外は L157=COUNTIF(L11:L155,"○")     ・     ・ Z157=COUNTIF(Z11:Z155,"○") で AA AB AD AF AH AJ AL AN AP列に AA157=SUBTOTAL(9,AA11:AA155)     ・     ・ AP157=SUBTOTAL(9,AP11:AP155) AP列にも手入力での項目があります。 <個人勤務表> I41からX41は I41=SUBTOTAL(3,I10:I40)と入れてありますけど I41=COUNTIF(I10:I40,"○")+COUNTIF(I10:I40,"●")+COUNTIF(I10:I40,"◆")どちらか。 I41以外は J41=COUNTIF(J10:J40,"○")     ・     ・ X41=COUNTIF(X10:X40,"○") Y Z AB AD AF AH AJ AL列に 41行目に Y41=IF(SUM(Y10:Y40)=0,"",SUM(Y10:Y40))     ・     ・ AL41=IF(SUM(AL10:AL40)=0,"",SUM(AL10:AL42)) としています。 式がばらばらですがよろしくお願いします。 ---- IからXは○●◆以外の何が入力される事がありますか? (HANA) ---- >IからXは○●◆以外の何が入力される事がありますか? 今のところはありません。 (4949) ---- では、何か入力が有った場合にカウントする事にします。 tblの範囲の次の行なので、tblの大きさを大きくしても良いのですが パーツを一つ増やそうと思います。 トータル用の変数として >Dim tbl(1 To 31, 1 To 34) の下に Dim Totl(1 To 1, 1 To 34) を入れてください。 実際に、カウントや合計をするコードは、 End If と Next の間に If tbl(i, 5) <> "" Then Totl(1, 5) = Totl(1, 5) + 1 'I 1直 If tbl(i, 6) <> "" Then Totl(1, 6) = Totl(1, 6) + 1 'J 時差 If tbl(i, 7) <> "" Then Totl(1, 7) = Totl(1, 7) + 1 'K 2直 If tbl(i, 8) <> "" Then Totl(1, 8) = Totl(1, 8) + 1 'L 変2直 Totl(1, 21) = Totl(1, 21) + Val(tbl(i, 21)) 'Y 勤務時間 Totl(1, 22) = Totl(1, 22) + Val(tbl(i, 22)) 'Z 早出残業直 Totl(1, 24) = Totl(1, 24) + Val(tbl(i, 24)) 'AB 深夜時間 Totl(1, 26) = Totl(1, 26) + Val(tbl(i, 26)) 'AD 遅早私 を追加。 最後に書き出す部分も >Range("E10").Resize(UBound(tbl, 1), UBound(tbl, 2)).Value = tbl の下に Range("E41").Resize(UBound(Totl, 1), UBound(Totl, 2)).Value = Totl を追加して下さい。 ↑のコードはそれらを反映させたものと差し替えておきますが 実際のシートの状況が良く分からないので、詳細はそちらで合わせて下さい。 (HANA) ---- >If tbl(i, 5) <> "" Then Totl(1, 5) = Totl(1, 5) + 1 'I 1直 >Totl(1, 21) = Totl(1, 21) + Val(tbl(i, 21)) 'Y 勤務時間 >Range("E10").Resize(UBound(tbl, 1), UBound(tbl, 2)).Value = tbl >Range("E41").Resize(UBound(Totl, 1), UBound(Totl, 2)).Value = Totl 詳細を教えてもらっていいですか? > If Range("B" & i + 9).Value <> "" Then で11のシートのみ 型が一致しませんでデバックになったのですが12のシートと見比べたのですが なぜなのか不明です。 質問ばかりで。。。よろしくお願いします。 (4949) ---- >型が一致しませんでデバック エラー値が無いですか? エラーメッセージの中に[デバッグ]ボタンがあると思います。 押すと「If Range("B" & i + 9).Value <> "" Then」がハイライトされますか? その時 i の部分にマウスポインタを近づけてみて下さい。 iの変数の中身が表示されます。 また、Range の部分に近づけた時も何と表示されるか確認してみて下さい。 或いは、ローカルウィンドウを表示させて、iの中身を確認して下さい。 B列の i+9 のセルの値を確認して下さい。 >詳細を教えてもらっていいですか? えっと。。。何が分からないですか? 質問が漠然としていてどの部分を説明すれば良いのか良く分からないです。 上の二つに関しては Sub Test1() If Range("A1").Value <> "" Then Range("A2").Value = Range("A2") + 1 Range("B2").Value = Range("B2") + Range("A2") End Sub こんなコードを繰り返し実行して見ると分かりますか? コードを読んで、結果を想定して、実行して、結果を確認してみて下さい。 下の二つに関しては  UBound(tbl, 1)・・・・配列(tbl)の行数  UBound(tbl, 2)・・・・配列(tbl)の列数 が分かります。 変数の宣言をした時に Dim tbl(1 To 31, 1 To 34) としたので、行数は31,列数は34 です。 E10セルを基準に31行と34列の範囲に、tblの値を書き出します。 Resizeは、ワークシート関数に OFFSET関数が有りますが OFFSET(基準,行数,列数,高さ,幅) ~~~~ ~~~~~~~この部分のイメージです。 OFSET(E10,,,31,34) だと、E10セルを基準に31行と34列の範囲 ですよね。 たとえば Sub Test2() Range("D5").Resize(2, 2).Value = Range("A1:B2").Value End Sub A1:B2セルの値を、D5:E6セルに転記します。 ローカルウィンドウを表示させておくと、変数の内容を確認する事が出来ます。 また、ステップインで実行させると、コードを一行ずつ実行出来ます。 For i = 1 To 31 の上の行にでも「Stop」を入れて下さい。 自動的に実行された時、この行で一旦止まります。 [F8]キーを押すことで、一行ずつ実行出来ます。 (HANA) ---- >その時 i の部分にマウスポインタを近づけてみて下さい。 >iの変数の中身が表示されます。 i=16と表示されました。 E列の上のほうしか見てなくて#N/Aがありました。 これは個人勤務表の行を固定してるため暦日で30日までしかない日は31日のところが#N/A になります。 >If Range("C" & i + 9).Value <> "" Then ←この部分でエラー処理出来ないでしょうか? >With Sheets(Format(Replace(Range("C" & i + >9).Value, "※", ""), "d日")) >下の二つに関しては  >UBound(tbl, 1)・・・・配列(tbl)の行数  >UBound(tbl, 2)・・・・配列(tbl)の列数 ←この部分 >が分かります。 これでわかりました。 >If tbl(i, 5) <> "" Then Totl(1, 5) = Totl(1, 5) + 1 'I 1直        ↑         ↑        ↑       この部分がよく分かりません。。。          個人勤務表のE列から数えて5番目がIなので5ですよね?  Uの列の合計のみ計算しないなんて出来ますか? 合計の転記ばっちりできましたけど解読がまだまだです。 (4949) ---- >暦日で30日までしかない日は31日のところが#N/Aになります。 と原因が分かっているのですから、それを解消すれば良いと思います。 どの様な数式を使っていて、30日までしかない日に#N/Aエラーが出ているのでしょう? >>If tbl(i, 5) <> "" Then Totl(1, 5) = Totl(1, 5) + 1 'I 1直 >                ↑ >               この部分がよく分かりません。。。 変数 Totlは    Dim Totl(1 To 1, 1 To 34) の大きさの配列です。 最後にやはりE列を先頭に書き出そうと思っているので    Range("E41").Resize(UBound(Totl, 1), UBound(Totl, 2)).Value = Totl Totl(1, 1) が E列(E41セル)にあたります。 Totl(1, 5)だとI列(I41セル)の位置になります。 最初から有る変数 Tbl と、今回追加した変数 Totl の見分けはついていますか? >Uの列の合計のみ計算しないなんて出来ますか? は、ちょっと意味がよく分かりません。 私が載せたコードでは、Y,Z,AB,AD列が合計されます。 カウントするのは、I,J,K,L列です。 U列と言うと、17列目ですか? で、計算せずにどうするのですか? 現在コードはどの様に成っているのでしょう? (HANA)   ---- >どの様な数式を使っていて、30日までしかない日に#N/Aエラーが出ているのでしょう? sheet1 J8にその月の始まり日(例えば6/16)を入力してます。作業列は9行目からです。 E      F G       J [8]  6/16 [9]  =DAY($J$8+0) ※ =J8 [10]  =DAY($J$8+1)         =J9+1 ・          ・ [23]     =DAY($J$8+14)  ※     =IF(OR(F23=1,F23=2),"",$J$8+14) [24] #N/A  =DAY($J$8+15)        =IF(OR(F24=3,F24=1,F24=2),"",J8+15) といった感じでE24に#N/Aエラーが出てます。 >私が載せたコードでは、Y,Z,AB,AD列が合計されます。 >カウントするのは、I,J,K,L列です。 >U列と言うと、17列目ですか? U列に年休の列がありまして、U41に○のカウントでU42に前または後のカウントをしてましたので。。。 すいません、説明不足で。。 >最初から有る変数 Tbl と、今回追加した変数 Totl の見分けはついていますか? 最初から有る変数 Tblは転記 今回追加した変数 Totl はトータルかと思ってましたけど。。。。違ってたらすみません。 (4949)   ---- データだけだとイメージも分かりにくいので 見出しも付けて下さい。  ・・・見出し 無いのですか?  無い場合は、説明でも良いですが。 それから、同じシートが作れる様に情報を載せてもらえると良いと思います。 Sheet1のE列には何か数式が入っているから #N/A に成っているのですよね? F,J列はご提示の式&日付が入っていて、G列の「※」は手入力? >U41に○のカウントでU42に前または後のカウントをしてましたので。。。 前または後のカウント って何ですか? 個人勤務表のデータがどうなっている時、U41はどうなれば良いのですか? U42も今回初めて出てくるセルなので何と関わってきているのか良く分からないです。 U41のデータが消えてしまうのが問題でしょうか? U41には数式が入っていますか?値が入っていますか? >今回追加した変数 Totl はトータルかと思ってましたけど。。。。違ってたらすみません。 いや、それで合っていますが。。。じゃあ Totl(1, 5) がよく分からないのが、何が分からないのか 分からないです。。。 例えば、 tblの大きさを一行分大きくして  Dim tbl(1 To 31, 1 To 34) → Dim tbl(1 To 32, 1 To 34) ~~ If tbl(i, 5) <> "" Then tbl(32, 5) = tbl(32, 5) + 1 だったら、分かりますか?~~~~~~~~~~ ~~~~~~~~~~ Totl(1, 5) → tbl(32, 5) 10行目を 1番目から数えると、合計行が32番目にあたりますが。 (HANA) ---- 今ご説明の Sheet1 と言うのは [[20110726144421]] 『IF関数』(もこもこ) こちらのシートの事ですよね? この時は [A] ・・・・ [H] [I] [J] [K] [L] [M] [N] [O] [P] [Q] ・・・・ [ 1] : 検査 A班1 B班1 C班1 : [ 9] ※7/16※ 7/16 ※7/16※ [10] ※7/17※ 7/17 ※7/17※ [11] 7/18 ※7/18※ 7/18 [12] 7/19 7/19 ※7/19※ : [39] と成っていたと思いますが。。。今は [A] ・・・・ [E] [F] [G] [H] [I] [J] [ 1] : [ 8] 6/16 [ 9] 16 ※ 6/16 [10] 17 6/17 [11] 18 6/18 [12] 19 6/19 [13] 20 6/20 [14] 21 6/21 [15] 22 6/22 [16] 23 6/23 [17] 24 6/24 [18] 25 6/25 [19] 26 6/26 [20] 27 6/27 [21] 28 6/28 [22] 29 6/29 [23] 30 ※ 6/30 [24] 1 6/30 って事は、違うシートなのかな? 何がどうなれば良いのだろう。。。? それを聞いた方が早いのかもしれません。 (HANA) ---- E列が個人の勤務表に反映してる日付です。なのでE24が#N/Aなのでデバックになりました。 F列がJ列の日にちのみ表示してる列です。 G列は休みの日の※マーク・・・手入力です。 J列はその勤務の月の基本データになります。J8のみ手入力です。 E24には=IF(G24<>"*","  "&MONTH(J24)&"/"&RIGHT("0"&DAY(J24),2)&" ","※ "&MONTH(J24) &"/"&RIGHT("0"&DAY(J24),2)&"※") としてます。 E=日付 F=日にちのみ表示 G=休みマーク J=基本日付     E      F G       J [8]  6/16 [9]  =DAY($J$8+0) ※ =J8 [10]  =DAY($J$8+1)         =J9+1 ・          ・ [23]     =DAY($J$8+14)  ※     =IF(OR(F23=1,F23=2),"",$J$8+14) [24] #N/A  =DAY($J$8+15)        =IF(OR(F24=3,F24=1,F24=2),"",J8+15) を、表示は以下のようです。     E      F G       J [8]  6/16 [9]    16    ※ 6/16 [10]    17            6/17 ・           ・ [23]       30     ※      6/30 [24] #N/A   1     #N/A      空白 >前または後のカウント って何ですか?   半日年休がありまして前半か後半かの表示になります。 >個人勤務表のデータがどうなっている時、U41はどうなれば良いのですか? >U42も今回初めて出てくるセルなので何と関わってきているのか良く分からないです。 >U41のデータが消えてしまうのが問題でしょうか?   Uの列は○または前または後が入力されるので   U41は○のカウントだけ表示していただき   U42は前と後のカウントと分けてカウントをしたいのです。 >U41には数式が入っていますか?値が入っていますか?   今は何も入ってません。 >Totl(1, 5) がよく分からないのが、何が分からないのか 分からないです。。。   ここは理解できました。 [[20110726144421]] 『IF関数』(もこもこ) なのですが二人で作成してるので。。。ぶつかってました。変わってないです。 こんな無様な説明ですけど。。。よろしくお願いします。 (4949) ---- この二つのシートの関係はどうなっていますか? もこもこさんが「勤務データシート」と呼んで居られたシートが 個人勤務表にHLOOKUP関数で参照されていると思っていますが??   その時は、H列が先頭だったのです。   今はE列が先頭? たぶん、E列は E9 =IF(J9="","",TEXT(J9,IF(G9="*","※ m/dd※","  m/dd "))) なんて式で良いんでしょうね? で、J22:J24は =IF(J21="","",IF(MONTH($J$8)=MONTH(J21+1),J21+1,"")) にしておけば、F列が不要に成ると思います。 (HANA) ---- HANAさん!なんてすばらしい!!! もう、かなりの感謝です。 >で、J22:J24は >=IF(J21="","",IF(MONTH($J$8)=MONTH(J21+1),J21+1,"")) >にしておけば、F列が不要に成ると思います。 確かにF列は不要でした。 あんな説明で分かって頂けてすごい感謝です。 まさにE24は空白になってるしデバックもなくなったしHANAさんにはなんで こんな式にしてるの?て思われたかもしれないですけど。。。ありがとうございます。 (4949) ---- エラーは、後で色々面倒な事に成りますので 基本的には放っておかない方が良いと思いますよ。 エラーさえなければ、SUMで計算出来るのに。。。 なんて状況は、良く有ると思います。 さて >  U41は○のカウントだけ表示していただき >  U42は前と後のカウントと分けてカウントをしたいのです。 に関してですが、U42は 前or後 と入っているセルの個数を数えれば良いのでしょうか? それとも、前:1回 後:3回 の様に分けて数えて分けて表示が必要なのでしょうか? 今は、Totlの配列を1行分しか確保していません。 42にも結果が必要なら、ここは2行分確保しておいて Dim Totl(1 To 2, 1 To 34) ~ セルの値が○の時は、1行目に +1 セルの値が前or後の時は、2行目に +1 If tbl(i, 17) = "○" Then Totl(1, 17) = Totl(1, 17) + 1 'U 年休(全休) If tbl(i, 17) = "前" Or tbl(i, 17) = "後" Then _ Totl(2, 17) = Totl(2, 17) + 1 'U 年休(半休) 最後に書き出す部分の範囲は UBound(Totl, 1) 行分にしてあるので変更は不要です。 >こんな式にしてるの?て思われたかもしれないですけど。。。 いえ、私はもっとひどい式を書いていましたよ。 色々な人のやり方を見るのは、勉強になると思います。   J25は =DATE(YEAR($J$8),MONTH($J$8)+1,1) とかね。 それから、「どの様なエラーか」ってのは原因や回避策を考える上で結構重要で #N/Aエラーと書いておられましたが、実際は #VALUE!エラーでしたね? 同じシートが見えているわけではないので、気をつけて教えていただけると良いのですが。。。 ちなみに、内容とは関係ありませんが、今のうちに書いておきます。 マクロでも、エラーになった場合は「エラーになった」と言います。 で、デバッグしてエラーにならない様に修正をします。 エクセル君は文句を言うだけで、デバッグはしてくれません。(涙) (HANA)  ---- 今は、Totlの配列を1行分しか確保していません。 42にも結果が必要なら、ここは2行分確保しておいて Dim Totl(1 To 2, 1 To 34) ~ >セルの値が○の時は、1行目に +1 >セルの値が前or後の時は、2行目に +1 > If tbl(i, 17) = "○" Then Totl(1, 17) = Totl(1, 17) + 1 'U 年休(全休) > If tbl(i, 17) = "前" Or tbl(i, 17) = "後" Then _ > Totl(2, 17) = Totl(2, 17) + 1 'U 年休(半休) この式に変更したら完璧に出来ました。 ありがとうございました。 >同じシートが見えているわけではないので、気をつけて教えていただけると良いのですが。。。 すいません。 (4949) ---- もしも、2月の後半の日付を扱う際 該当の年以外の年だった場合 思った結果とは違う結果に成る可能性が有ります。 今、同じシートのB列の日付(月日情報だけの日付)から日付を割り当てて居ますが 勤務データシートのJ列から特定する様にしておいた方が良いかもしれません。 そしたら「Replace」も使わなくて良くなりますしね。 変数を一つ追加して、シートをセット。 Dim ws1 As Worksheet Set ws1 = Sheets("勤務データ") ws1の日付を確認しながらのループ For i = 1 To 31 If ws1.Range("J" & i + 8).Value <> "" Then With Sheets(Format(ws1.Range("J" & i + 8).Value, "d日"))         個別勤務表は10行目が16日ですが、このシートは 9行目が16日ですか? 最後に(End Sub のすぐ上で良いです) Set ws1 = Nothing って感じで出来ると思います。 日々勤務表 から、対応する個別勤務表用のデータを集めて来る&集計する ってのは、これで完成ですか? Sheet1から個別勤務表用にデータを振り分け&個別勤務表にデータ転記 ってのは もう少し長くなりそうなので、先に 個別勤務表の数式のマクロ化を考えてみてはどうでしょう。 このスレは結構長く成ってしまったので ↓へ移動して続けて貰って良いでしょうか? [[20110321134155]] 『マクロで勤務表』(ふわり) その際、完成しているコードを載せておいてもらえると良いと思います。 また、ユーザーフォームも関係して来る様で有れば その部分のご説明も書いておいて頂けると良いと思います。 このシートが同じシートかな?と思っていますが。。。 [[20110808104507]] 『エクセルで勤務表作成』(もこもこ)  こんな感じで (半平太さんが書いて居られる様に) 分かりやすく シートの状況の説明もしておいてもらえると良いと思います。 (HANA) ---- >個別勤務表は10行目が16日ですが、このシートは 9行目が16日ですか? 勤務データは9行目です。 >日々勤務表 から、対応する個別勤務表用のデータを集めて来る&集計する >ってのは、これで完成ですか? 31行34列の枠転記OKで41行42行の集計もOKです。 かつ勤務データからの >For i = 1 To 31 >If ws1.Range("J" & i + 8).Value <> "" Then >With Sheets(Format(ws1.Range("J" & i + 8).Value, "d日")) の部分も完成しました。 (4949) ---- できましたか。良かったです。 色々間違いが有りました。 >>先に 個別勤務表の数式のマクロ化を考えてみてはどうでしょう。 「個別勤務表」ではなく、「日々勤務表」でした。 しかも、「個別勤務表」は「個人勤務表」と言う名前で呼んで居ましたね。 色々混乱してごめんなさい。 日々勤務表に関しては、一旦『マクロで勤務表』スレに移動しますね。 (HANA)