- ベストアンサー
[困ってますo(TヘTo) ]
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
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
その他の回答 (5)
- mo2yakko
- ベストアンサー率54% (30/55)
わからない部分を一つ一つ分けて質問された方が ほかの方々の返答も得られて良いかもです。 (このままでも続けられてもぜんぜんOKですよ~) >(2)の部分を組み入れていきたいのですが、エラーになってしまいます。 エラーメッセージを書いてくれないと判らないのです。;; >実際はB列~J列が結合されてて、『A君・B君』等の名前のは先頭が5行目からの入力になります。 値を取得するだけなら連結している場合は左端の列を指定してあげれば良いです。 この場合は"B5"で良いかもです。 strName(iLoopCnt) = .Range("B5").Offset(iLoopCnt, 0)
お礼
何度も回答ありがとうございます。 お陰様でとても勉強になり、名前を入力する前の段階までですが いい感じに仕上がってきてます。 後はループをどうやって設定すればいいのかで悩んでますが、 名前の部分は手入力して(集計のたびに入力する名前が変わるので) ワークシート上でですがVLOOKUPは何度も使用しているので、 VLOOKUPをVBAに取り入れて名前を参照して前回点数を検索→表示 っていう形でなら私にもどうにか構文が作れそうな気がしてます。 今のところさっぱりですが(⌒_⌒; タラタラ 過去の質問やら書籍と睨めっこして作ってみますね。 どーしても分からなければ、新たに質問を立ち上げたいと思いますので また教えていただきたいですm(_ _;)m
- mo2yakko
- ベストアンサー率54% (30/55)
No3です。 シート名を作成した日付(テスト実施日)にすれば新旧の判断ができますよね? シート名を降順(日付のでかい順)に見て行って A君やB君にとっての最新の前回データを検索するのです。 文章でざっくりと説明します。 プログラムは書ききれない;; 前提条件 (1)シート名を作成した年月日に(最新の年月日が一番大きな値) Sheet1→20100101、Sheet2→20100201、→20100301 (2)条件入力画面を作成する 入力条件は出力先シート名(20100201とか20100301)だけ マクロを開始するボタンもあると良いかも 【マクロ内容】 (1)条件入力画面から出力シート名を取得する (2)出力シートから名前(A君、B君など)を取得する。 (3)全シートの名前を取得し、処理対象のシート名より小さい値のシート名を取得する (4)取得したシート名を降順(日付のでかい順)でソート (5)検索処理((4)で取得したシート名数分ループ) ・(2)で取得した名前で検索(たぶん人数分 ・検索できれば得点を保存、取得確認フラグもTrue ・全員分の取得確認フラグがTrueになるか、全シート検索したらループを抜ける (6)取得した得点を処理対象のシートに反映させる。
補足
有難うございます。なんとなく流れは理解できました。 ですが、マクロ初心者なもので(ノω=;)。。。 (1)条件入力画面から出力シート名を取得する。 ↑↑↑この時点で躓いてます。 どういう操作を行ったらいいのでしょうか・・・。 ホントすみません(´;ω;`)
- mo2yakko
- ベストアンサー率54% (30/55)
どのシートのデータがその人の最新の前回データなのか 判断できないと思います。 判断する要素を明確にしないと無理ではないかと思います。 ※私ならマクロ作って計算させちゃいますが・・・ たとえばシート名を作成した年月日にして マクロで更新するシート以外のシートを検索して 各人の最新のデータを取得する感じですけどね。
お礼
有難うございました。大変勉強になりました。 ですが、一つ前のシートに出てこない名前があるのでこの方法ではちょっと難しそうです。 やっぱりマクロとか使わないと無理そうですね(ノω=;)。。。
補足
職場からの投稿で、家にPCが無い為お返事が遅くなってしまいましたm(_ _;)m マクロは未知の世界です。逆に何で理解できるの?と不思議な感じです。 簡単な方法であるなら教えて頂きたいのですが、やはり無理ですよね。 これを機会に勉強してみます。
- KURUMITO
- ベストアンサー率42% (1835/4283)
ごめんなさい。シート番号が二桁になりますと違った式が必要です。適宜判断してください。もちろん一桁でも二桁でも関係ない式をたてることもできますね。今は時間が無くなりましたので失礼します。
お礼
有難うございました。大変勉強になりました。 ですが、一つ前のシートに出てこない名前があるのでこの方法ではちょっと難しそうです。 やっぱりマクロとか使わないと無理そうですね(ノω=;)。。。
補足
職場からの投稿で、家にPCが無い為お返事が遅くなってしまいましたm(_ _;)m 早速取り掛かってみます。 有難うございます。 「一桁でも二桁でも関係ない式」どんなかなぁぁ。。気になりますがお暇な時にでも 教えていただけると助かります。
- KURUMITO
- ベストアンサー率42% (1835/4283)
各シートの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列の値が表示されるようになります。シートが幾つ増加しても対応は同じです。
お礼
エラーを自分なりに調べたりしてもよく分からなかったので、 色んな事例と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さんにばかり質問をしている状態なので申し訳なく思っています。
補足
丁寧な回答、有難うございます。 教えて頂いたことを参考にしてやってみました。 1.『入力画面』というシートを作成 2.念のために参照画面の通りに入力するような様式を作りました。 3.コマンドボタンを作成 4.「コードの表示」→「'処理開始ボタンをクリック・・・・・シート名を取得する End Sub」 までを全てコピペ 5.「実行」 以上の手順で作業してみましたが、 『実行時エラー '9' インデックスが有効範囲にありません。』 というエラーがでました。 古い日付のシートが無いから?と思って、一番古い日付の空のシートを作成してみましたが 同じエラーが帰って来ました。 何が間違っているんでしょうか・・・