• ベストアンサー

[困ってますo(TヘTo) ]

[困ってますo(TヘTo) ] エクセル2003についての質問です。 統計を取るたびごとにシート数が増えていく事を前提とし、名前を入力すると B列に前回までの合計が自動反映させるにはどのようにすればよいでしょうか? 不可能な事なんでしょうか・・? エクセルに詳しい方、お知恵を貸してくださいm(_ _;)m ※A列に入る名前は50項目ほどあり、毎回同じ名前が入るとは限りません 画像では3つのデータしか入ってませんが、実際は20人分のデータが1枚に入る予定で、シート分けしたら現状20シート分あり、これからも増えます。

質問者が選んだベストアンサー

  • ベストアンサー
  • mo2yakko
  • ベストアンサー率54% (30/55)
回答No.5

No2~3です 難しく考える必要はないですよ。 『入力画面』という名前のシートを作成します。 てけとーなセルを入力場所って決めてしまえば良いです。 画像参照です。 なおコマンドボタンは下記にありますので。(EXCEL2003) 表示→ツールバー→コントロールツールボックス (2)までを書いたつもりですが、あまり綺麗なプログラムとは言えないかもです。 '処理開始ボタンをクリック Private Sub CommandButton1_Click()    Call SearchData End Sub 'メイン処理 Sub SearchData()  Dim strSheetName As String  Dim strName() As String  Dim iLoopCnt As Integer    '(1)条件入力画面から出力シート名を取得する  strSheetName = Worksheets("入力画面").Range("C4")    '(2)出力シートから名前(A君、B君など)を取得する。  iLoopCnt = 0  With Sheets(strSheetName)   Do    '合計に到達したらループを抜ける    If .Range("A2").Offset(iLoopCnt, 0) = "合計" Then     Exit Do    End If    '取得した名前を配列に保存    ReDim Preserve strName(iLoopCnt)    strName(iLoopCnt) = .Range("A2").Offset(iLoopCnt, 0)    iLoopCnt = iLoopCnt + 1   Loop  End With    '(3)全シートの名前を取得し、処理対象のシート名より小さい値のシート名を取得する   End Sub

simogumi
質問者

お礼

エラーを自分なりに調べたりしてもよく分からなかったので、 色んな事例とmo2yakkoさんの文を参考にしなら、とりあえずですが 日付を入力して実行ボタンを押すとシートが挿入されるように作りました。 やっとです(o^∇^o) Sub Macro1() Dim strSheetName As String Worksheets("元本").Copy after:=Worksheets("入力画面") ActiveSheet.Name = Worksheets("入力画面").Range("C4") Worksheets("入力画面").Range("C4").ClearContents End Sub まだまだ(1)の部分だけです。 (2)の部分を組み入れていきたいのですが、エラーになってしまいます。 例にあげた様式と実際の様式が違うので、エラーになっているのかもしれませんね。 実際はB列~J列が結合されてて、『A君・B君』等の名前のは先頭が5行目からの入力になります。 前回までの点数合計がK列です。 追伸:いったんこの質問を閉めて、分からない部分毎に質問を立ち上げていったほうがいいですか? mo2yakkoさんにばかり質問をしている状態なので申し訳なく思っています。

simogumi
質問者

補足

丁寧な回答、有難うございます。 教えて頂いたことを参考にしてやってみました。 1.『入力画面』というシートを作成 2.念のために参照画面の通りに入力するような様式を作りました。 3.コマンドボタンを作成 4.「コードの表示」→「'処理開始ボタンをクリック・・・・・シート名を取得する End Sub」  までを全てコピペ 5.「実行」 以上の手順で作業してみましたが、 『実行時エラー '9'  インデックスが有効範囲にありません。』 というエラーがでました。 古い日付のシートが無いから?と思って、一番古い日付の空のシートを作成してみましたが 同じエラーが帰って来ました。 何が間違っているんでしょうか・・・

その他の回答 (5)

  • mo2yakko
  • ベストアンサー率54% (30/55)
回答No.6

わからない部分を一つ一つ分けて質問された方が ほかの方々の返答も得られて良いかもです。 (このままでも続けられてもぜんぜんOKですよ~) >(2)の部分を組み入れていきたいのですが、エラーになってしまいます。 エラーメッセージを書いてくれないと判らないのです。;; >実際はB列~J列が結合されてて、『A君・B君』等の名前のは先頭が5行目からの入力になります。 値を取得するだけなら連結している場合は左端の列を指定してあげれば良いです。 この場合は"B5"で良いかもです。 strName(iLoopCnt) = .Range("B5").Offset(iLoopCnt, 0)

simogumi
質問者

お礼

何度も回答ありがとうございます。 お陰様でとても勉強になり、名前を入力する前の段階までですが いい感じに仕上がってきてます。 後はループをどうやって設定すればいいのかで悩んでますが、 名前の部分は手入力して(集計のたびに入力する名前が変わるので) ワークシート上でですがVLOOKUPは何度も使用しているので、 VLOOKUPをVBAに取り入れて名前を参照して前回点数を検索→表示 っていう形でなら私にもどうにか構文が作れそうな気がしてます。 今のところさっぱりですが(⌒_⌒; タラタラ 過去の質問やら書籍と睨めっこして作ってみますね。 どーしても分からなければ、新たに質問を立ち上げたいと思いますので また教えていただきたいですm(_ _;)m

  • mo2yakko
  • ベストアンサー率54% (30/55)
回答No.4

No3です。 シート名を作成した日付(テスト実施日)にすれば新旧の判断ができますよね? シート名を降順(日付のでかい順)に見て行って A君やB君にとっての最新の前回データを検索するのです。 文章でざっくりと説明します。 プログラムは書ききれない;; 前提条件 (1)シート名を作成した年月日に(最新の年月日が一番大きな値)  Sheet1→20100101、Sheet2→20100201、→20100301 (2)条件入力画面を作成する  入力条件は出力先シート名(20100201とか20100301)だけ  マクロを開始するボタンもあると良いかも 【マクロ内容】 (1)条件入力画面から出力シート名を取得する (2)出力シートから名前(A君、B君など)を取得する。 (3)全シートの名前を取得し、処理対象のシート名より小さい値のシート名を取得する (4)取得したシート名を降順(日付のでかい順)でソート (5)検索処理((4)で取得したシート名数分ループ)  ・(2)で取得した名前で検索(たぶん人数分  ・検索できれば得点を保存、取得確認フラグもTrue  ・全員分の取得確認フラグがTrueになるか、全シート検索したらループを抜ける (6)取得した得点を処理対象のシートに反映させる。

simogumi
質問者

補足

有難うございます。なんとなく流れは理解できました。 ですが、マクロ初心者なもので(ノω=;)。。。 (1)条件入力画面から出力シート名を取得する。 ↑↑↑この時点で躓いてます。 どういう操作を行ったらいいのでしょうか・・・。 ホントすみません(´;ω;`)

  • mo2yakko
  • ベストアンサー率54% (30/55)
回答No.3

どのシートのデータがその人の最新の前回データなのか 判断できないと思います。 判断する要素を明確にしないと無理ではないかと思います。 ※私ならマクロ作って計算させちゃいますが・・・ たとえばシート名を作成した年月日にして マクロで更新するシート以外のシートを検索して 各人の最新のデータを取得する感じですけどね。

simogumi
質問者

お礼

有難うございました。大変勉強になりました。 ですが、一つ前のシートに出てこない名前があるのでこの方法ではちょっと難しそうです。 やっぱりマクロとか使わないと無理そうですね(ノω=;)。。。

simogumi
質問者

補足

職場からの投稿で、家にPCが無い為お返事が遅くなってしまいましたm(_ _;)m マクロは未知の世界です。逆に何で理解できるの?と不思議な感じです。 簡単な方法であるなら教えて頂きたいのですが、やはり無理ですよね。 これを機会に勉強してみます。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

ごめんなさい。シート番号が二桁になりますと違った式が必要です。適宜判断してください。もちろん一桁でも二桁でも関係ない式をたてることもできますね。今は時間が無くなりましたので失礼します。

simogumi
質問者

お礼

有難うございました。大変勉強になりました。 ですが、一つ前のシートに出てこない名前があるのでこの方法ではちょっと難しそうです。 やっぱりマクロとか使わないと無理そうですね(ノω=;)。。。

simogumi
質問者

補足

職場からの投稿で、家にPCが無い為お返事が遅くなってしまいましたm(_ _;)m 早速取り掛かってみます。 有難うございます。 「一桁でも二桁でも関係ない式」どんなかなぁぁ。。気になりますがお暇な時にでも 教えていただけると助かります。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

各シートのE1セルには次の式を入力して、そのシートのシート名を表示させます。 =TRIM(MID(CELL("filename",A1),FIND("]",CELL("filename",A1))+1,10)) 次にシート1を除いたすべてのシートのB2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(OR(A2="",COUNTIF(INDIRECT("Sheet"&RIGHT($E$1,1)-1&"!A:A"),A2)=0),"",VLOOKUP(A2,INDIRECT("Sheet"&RIGHT($E$1,1)-1&"!A:D"),4,0)) このようにすることで一つ前のシート番号のD列の値が表示されるようになります。シートが幾つ増加しても対応は同じです。

関連するQ&A