[[20080618181157]] 『IF関数について』(エクセル) >>BOT

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『IF関数について』(エクセル)

1行に1名のデータ(B列〜Q列まで)を入力しています。

 で、特定の人物のデータを反映させたいのですが、わからない
 事があります。(以下に入力内容を記載してみます。)

          B列 C列   D列   ・・・Q列
  (8行目)       1   2    3 ・・・
 (検索する行)   2  下記1式  下記2式 ・・・
 (入力行)    1  田中太郎  タナカ タロウ・・・
          2  田中次郎  タナカ ジロウ・・・

 1式 =vlookup($B$10,$B$15:$Q$30,C8,FALSE)
 2式 =vlookup($B$10,$B$15:$Q$30,D8,FALSE)

 とQ列まで組んでみると、検索する行のB列に反映したい人の行番号
 を入れると反映されます。
 (検索する行は9行目、入力行は15行目から30行目までとします。)

 ここからが本題なのですが、同じ人に時系列で変更項目があり、
 変更項目を行を変えて入力した場合、その人の最新データを引っ張って
 くる式を教えていただきたいのです。

 たとえば、田中太郎の1回目の変更データを10行目に入れた場合、 
 B列の数字を枝番(例えば1.1、1.2・・・)と入れていき、
 検索行で田中さんの番号(1)を入れると枝番の最新行を反映させたいのです。

 お手数ですが、ご教示ください。
 もし、説明不足の箇所がございましたら、ご連絡いただければと思います。
 よろしくお願いいたします。


 こんばんは〜♪

 レイアウトが、良くわかりませんが。。。
 されたい事はわかりますので。。

 こんな表を元にした回答です。。

 ┌─┬────┬────┬────┬─────┬────┐
 │  │   A    │   B    │   C    │    D     │   E    │
 ├─┼────┼────┼────┼─────┼────┤
 │10│        │       1│     1.2│          │        │
 ├─┼────┼────┼────┼─────┼────┤
 │11│        │        │        │          │        │
 ├─┼────┼────┼────┼─────┼────┤
 │12│        │        │        │          │        │
 ├─┼────┼────┼────┼─────┼────┤
 │13│        │        │        │          │        │
 ├─┼────┼────┼────┼─────┼────┤
 │14│        │        │        │          │        │
 ├─┼────┼────┼────┼─────┼────┤
 │  │        │        │        │タナカタロ│        │
 │15│        │       1│田中太郎│ウ        │aaa     │
 ├─┼────┼────┼────┼─────┼────┤
 │  │        │        │        │タナカジロ│        │
 │16│        │       2│田中次郎│ウ        │bbb     │
 ├─┼────┼────┼────┼─────┼────┤
 │  │        │        │        │タナカタロ│        │
 │17│        │     1.1│田中太郎│ウ        │ccc     │
 ├─┼────┼────┼────┼─────┼────┤
 │  │        │        │        │タナカタロ│        │
 │18│        │     1.2│田中太郎│ウ        │ddd     │
 ├─┼────┼────┼────┼─────┼────┤
 │19│        │        │        │          │        │
 └─┴────┴────┴────┴─────┴────┘

 表で、田中太郎さんのデータが3つ。。。

 B列の 1.2 のある行が最新データですネ!!。。。

 ★検索値の 1 を B10セルへ入力。。。

 隣のC10セルに、1.2 とあります。。
 これを出す式は、

 =MAX(INDEX((INT($B$15:$B$30/1)=B10)*($B$15:$B$30),))

 この式をこれまでのVLOOKの検索値に入れれば良いですネ!!。。。

 この式をVLOOKに入れると式が長くなりますから
 どこかのセルへ、入れておいてそのセルを参照して
 VLOOKの検索値にしてもいいですね。。。

 ご参考にどうぞ。。。

 。。。Ms.Rin〜♪♪


 ありがとうございます。
 ただ、ちょっと不明な点があります。
 いただいた例でいうとB10に検索したいデータを入力し、
 C10には田中次郎、D10にはタナカジロウ、E10にはdddを
 表示したいのですが、B10には上記MAX関数でいいと思います
 が、C10、D10、E10にはどのような関数を入れれば
 いいのでしょうか?

 Ms.rinさん、解決しました。ありがとうございます!!
 あと一点。教えていただいたのは田中次郎の最新(最終)データのみを
 反映させる方法でした。
 履歴を全て表現する方法はあるのでしょうか?
 (履歴は最大10個とする)

 例えば10行目・・入力表、11行目一番古い履歴、12行目次に古い履歴・・・
 20行目一番新しい履歴

 お手数ですが、教えてください。

 おはようございま〜す。。。♪

 >履歴を全て表現する方法はあるのでしょうか?
 >(履歴は最大10個とする)

 いろいろと方法はあります。。。

 でも。。。

 現在のデータ範囲は、

 >=vlookup($B$10,$B$15:$Q$30,C8,FALSE) 

 15行目から30行目になってます。

 >例えば10行目・・入力表、11行目一番古い履歴、12行目次に古い履歴・・・
 >20行目一番新しい履歴

 とすると、データ範囲に抽出データがかぶってしまいます。。

 どこのデータをどこのセルへ抽出して表示させたいか
 エクセルの表をコピーしてここへ、貼り付けて
 提示して頂いた方が良いと思います。。。。

 それが、解決の近道ですネ!!。。。

 。。。Ms.Rin〜♪♪


 ありがとうございます。フィルタオプションの設定がいいのかなとも思いましたが、
 どうしていいのかがわからなくて困っています。とりあえずしたいことを
 書いてみますね。

 (番号)  施設名   構造 建設年月日  数量  金額     摘要 
  1   公園用土地  土地  S45.1.1  500u  5,000,000
  1.01             S46.1.1   50u   500,000   購入
  1.02             S48.1.1  -100u  -3,000,000  売却による一部減
  2   公会堂   木造  S50.4.1  130u  1,500,000
  2.01         鉄筋  S55.4.1  150u  2,000,000   増築
 
 ・・といったデータが続くとします。

 要はこれを台帳に飛ばしたいのですが、整数単位で施設があり、変更が
 ある都度、少数単位で枝番号で整理を考えております。
 (番号1の施設では1.001〜1.999まで最大999の枝番)
 一番いいのは、入力したデータから別シートに検索したい施設のデータ
 のみが抽出されるのがいいのですが、できるでしょうか?

 テキスト本ではオートフィルターメソッドで数値の末尾を検索し、抽出する
 方法がありました(数字の先頭に'をつけて文字列として認識させるようです)
 が、末尾ではなく文頭で検索、抽出する方法があればいけそうな気もします。
 (番号の先頭文字が1であるものを全て抽出する。)

 こういったのは可能でしょうか?
 お手数ですが、教えてください。


 こんにちは〜♪

 お返事が遅くなってスミマセン!!でした。。。

 >フィルタオプションの設定がいいのかなとも思いましたが、

 私もそんな感じがします。

 というのは、

 >(番号1の施設では1.001〜1.999まで最大999の枝番)

 結構なデータ行になりそうですので、関数では実用的でない気がします。

 ただ、まだわからない事があります。

 (1)データ数は、最大何行位になりますか?

 (2)たとえば、番号1の施設の場合
 すべての枝番の付いたデータを抽出するのですか?

 (3)抽出するデータを、

 >要はこれを台帳に飛ばしたいのですが

 とありますが、施設毎の台帳(シート)ということですか?

 (4)台帳(シート)のどこのセル範囲へ、抽出するのですか?

 以上がわかれば、適切な回答が付くと思います。。。

 。。。Ms.Rin〜♪♪


いつも返信いただき、感謝します。
 ありがとうございます。

私もそんな感じがします。

 あとで作りかけのデータをいれてみますが、
 フィルタを使ったVBAにしたいと考えています。

 > 結構なデータ行になりそうですので、関数では実用的でない気がします。
 (1)データ数は、最大何行位になりますか?
  → 2000行程度と現在は想定しています。
 (2)たとえば、番号1の施設の場合
 すべての枝番の付いたデータを抽出するのですか?
   → そうですね。枝番毎にデータが変更されるものもあれば、そうでない
       ものもあります。そこが難しいと考えています。
 (3)抽出するデータを、要はこれを台帳に飛ばしたいのですが
 とありますが、施設毎の台帳(シート)ということですか?

   → 台帳のシートは1施設だけにしようと思っています。
       で、出力したいものを選んで飛ばすようにしたいと。
       (全施設の台帳を表現すると重くなると思いますので。。)
 (4)台帳(シート)のどこのセル範囲へ、抽出するのですか?
   → 長くなりますので、次のコメントで記載しますね。
       イメージとしては入力シート(userform)から
       データをいったん飛ばして(マクロというシート)、
       そこから「施設データ」というシートに飛ばしてデータを
       蓄積するようにしています。
       あとはそのデータのうちから選びたい施設のデータを
       台帳に飛ばすようにしています。    
       (とりあえず作りかけのものを次のコメントに記載しますので、
       よろしくお願いします。)


続けてコメントします。
 1.ユーザーフォームのVBAの式
 (データをマクロのシートの3行目に飛ばし、それを施設
   データのシートに飛ばします。)
   Private Sub ComboBox1_Change()

End Sub

Private Sub CommandButton1_Click()

 Sheets("マクロ").Select
 Range("g3").Select
 ActiveCell.Value = TextBox1.Value
 Range("h3").Select
 ActiveCell.Value = TextBox2.Value
 Range("j3").Select
 ActiveCell.Value = TextBox3.Value
 Range("p3").Select
 ActiveCell.Value = TextBox4.Value
 Range("q3").Select
 ActiveCell.Value = TextBox5.Value
 Range("b3").Select
 ActiveCell.Value = ComboBox1.Value
 Range("c3").Select
 ActiveCell.Value = ComboBox2.Value
 Range("d3").Select
 ActiveCell.Value = ComboBox3.Value
 Range("e3").Select
 ActiveCell.Value = ComboBox4.Value
 Range("f3").Select
 ActiveCell.Value = ComboBox5.Value
 Range("i3").Select
 ActiveCell.Value = ComboBox6.Value
 Range("k3").Select
 ActiveCell.Value = ComboBox7.Value
 Range("l3").Select
 ActiveCell.Value = ComboBox8.Value
 Range("m3").Select
 ActiveCell.Value = ComboBox9.Value
 Range("n3").Select
 ActiveCell.Value = ComboBox10.Value
 Range("o3").Select
 ActiveCell.Value = ComboBox11.Value

 Sheets("マクロ").Select
 ActiveSheet.Calculate
 Range("b3:q3").Select
 Selection.Copy
 Range("a1").Select
 Sheets("施設データ").Select
 Range("b6").CurrentRegion.End(xlDown).Select
 ActiveCell.PasteSpecial Paste:=xlPasteValues, 
 Operation:=xlNone, SkipBlanks _ 
 :=False, Transpose:=False Sheets("施設データ").Select
 Range("B6:C1000").Select
 Selection.NumberFormatLocal = "000"
 Range("B6").Select

 TextBox1.Value = Empty
 TextBox2.Value = Empty
 TextBox3.Value = Empty
 TextBox4.Value = Empty
 TextBox5.Value = Empty
 ComboBox1.Value = Empty
 ComboBox2.Value = Empty
 ComboBox3.Value = Empty
 ComboBox4.Value = Empty
 ComboBox5.Value = Empty
 ComboBox6.Value = Empty
 ComboBox7.Value = Empty
 ComboBox8.Value = Empty
 ComboBox9.Value = Empty
 ComboBox10.Value = Empty
 ComboBox11.Value = Empty
 Sheets("マクロ").Select

 End Sub

 Private Sub TextBox1_Change()
 End Sub

 Private Sub userform_activate()

 Sheets("マクロ").Select
 ComboBox1.RowSource = "b6:c1004"
 ComboBox1.ListRows = 50
 ComboBox1.SetFocus

 Sheets("マクロ").Select
 ComboBox2.RowSource = "c6:c1004"
 ComboBox2.ListRows = 50
 ComboBox2.SetFocus

 Sheets("マクロ").Select
 ComboBox3.RowSource = "d6:d1004"
 ComboBox3.ListRows = 10
 ComboBox3.SetFocus

 Sheets("マクロ").Select
 ComboBox4.RowSource = "e6:e1004"
 ComboBox4.ListRows = 10
 ComboBox4.SetFocus

 Sheets("マクロ").Select
 ComboBox5.RowSource = "f6:f1004"
 ComboBox5.ListRows = 10
 ComboBox5.SetFocus

 Sheets("マクロ").Select
 ComboBox6.RowSource = "i6:i10"
 ComboBox6.ListRows = 5
 ComboBox6.SetFocus

 Sheets("マクロ").Select
 ComboBox7.RowSource = "k6:k10"
 ComboBox7.ListRows = 5
 ComboBox7.SetFocus

 Sheets("マクロ").Select
 ComboBox7.RowSource = "k6:k10"
 ComboBox7.ListRows = 5
 ComboBox7.SetFocus

 Sheets("マクロ").Select
 ComboBox8.RowSource = "l6:l30"
 ComboBox8.ListRows = 10
 ComboBox8.SetFocus

 Sheets("マクロ").Select
 ComboBox9.RowSource = "m6:m30"
 ComboBox9.ListRows = 5
 ComboBox9.SetFocus

 Sheets("マクロ").Select
 ComboBox10.RowSource = "n6:n30"
 ComboBox10.ListRows = 5
 ComboBox10.SetFocus

 Sheets("マクロ").Select
 ComboBox11.RowSource = "o6:o10"
 ComboBox11.ListRows = 5
 ComboBox11.SetFocus

 TextBox1.SetFocus

 End Sub

2.次に作りかけですが、1で施設データのシートに

    飛ばしたデータを台帳に転写します。
    (選ぶ施設の番号はセルE2行目、ただし、00から始まる
      数字のため、F2行目に
     =IF(LEN(E2)=1,"00"&E2,IF(LEN(E2)=2,"00"&E2,IF(LEN(E2)=3,
     ""&E2,"")))を入れています。)

Application.ScreenUpdating = False

    Sheets("施設データ").Select
    Range("B5:q5").Select
    Selection.AutoFilter
    Dim tes1
    tes1 = Range("f2")
    Selection.AutoFilter Field:=1, Criteria1:=tes1
    Range("b6:q1000").Select
    Selection.Copy
    Sheets("転記シート").Select
    Range("B6").Select
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False
    Range("A1").Select
    Selection.ClearContents
    Sheets("施設データ").Select
    Selection.AutoFilter
    Range("A1").Select
    Selection.ClearContents

    Sheets("転記シート").Select
    Range("g6:j16").Select
    Selection.Copy
    Sheets("台帳").Select
    Range("i8").Select
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False

    Sheets("転記シート").Select
    Range("g17:j26").Select
    Selection.Copy
    Sheets("台帳").Select
    Range("n8").Select
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False

    Sheets("転記シート").Select
    Range("n6:n16").Select
    Selection.Copy
    Sheets("台帳").Select
    Range("d20").Select
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False

 今回お聞きしたいのは主にこちらです。要は施設データまで飛ばした
 蓄積データのうち、特定の施設の情報を台帳に飛ばしたいのです。
 で、飛ばしたい先は以下のとおりです。
 B列・・・施設番号。
           台帳シートのセルC4(同一施設のため、施設データの
           セルB6からいくら更新データがあっても同じ番号)
 C列・・・枝番ですが、台帳シートのセルH9〜H18(枝番001〜
           010)、N8〜N17(枝番011〜020)、H52〜H61(枝番
           021〜030)、N51〜N60(枝番31〜40)へと飛ばしたいです。
 D列・・・施設の名称
           台帳シートのセルF4(ただし、施設名称は変更の可能性が
           あるため、最新のデータを引っ張ってくるようにしたい)
 E列・・・所在地。
           最大3行で、J3〜J5に飛ばしたいのですが、住所に変更が
           ない場合はJ5だけに、途中で1回変更がある場合は最新を
           J5に、ひとつ古いデータをJ4に、途中で2回変更があった
           場合はふたつ古いデータをJ3に飛ばしたいです。
           (2回以上変更がある場合は2回変更があったものと同じ処理)
 F列・・・施設の構造
           セルD7〜D14で、変更がなければD7に、あればD7が
           一番古いデータ、最新がその下にくるようにしたいです。
           (ただし、E列やF列ともに変更がなければそのセルは0表示では
           なく、表示なし(空欄)にしたいです。)
 G列・・・施設異動年月日
           当初の年月日がセルI8、変更1回目〜変更10回目がI9〜I18、
           変更11回目〜変更20回目まではO8〜O17まで、変更21回目
           〜変更30回目はI52〜I61、変更40〜50回目がO51〜O60
           へ転写したいです。(ただし、変更がない所は空欄表示)

 以下データはQ列までありますが、G列までと同じ内容のため、以上を教えて
 いただければ対応は可能と思います。
 いろいろ書いてすいませんが、よろしくお願いします。

 レスがつかんようなんで、スレ上げしときます。
 ただし、これだけ。
      (弥太郎)
 '-------------------
 Private Sub CommandButton1_Click()
    Dim i As Integer, ary1, ary2
    ary1 = Array(7, 8, 10, 16, 17)
    ary2 = Array(2, 3, 4, 5, 6, 9, 11, 12, 13, 14, 15)
    With Sheets("マクロ")
        For i = 1 To 11
            If i < 6 Then
                .Cells(3, ary1(i - 1)) = Controls("TextBox" & i).Text
            End If
            .Cells(3, ary2(i - 1)) = Controls("ComboBox" & i).Value
        Next i
        ' ActiveSheet.Calculate
        ' Range("b3:q3").Select
        ' Selection.Copy
        ' Range("a1").Select
        ' Sheets("施設データ").Select
        ' Range("b6").CurrentRegion.End(xlDown).Select
        ' ActiveCell.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        ' :=False, Transpose:=False
        ' Sheets("施設データ").Select
        ' Range("B6:C1000").Select
        ' Selection.NumberFormatLocal = "000"
        ' Range("B6").Select
        For i = 1 To 11
            If i < 6 Then Controls("textbox" & i).Text = ""
            Controls("combobox" & i) = ""
        Next i
    End With
 End Sub

 '-----------------
 '通常コントロールにデータを仕込むにはInitialize
 'の方が良く使われとるようです。

 Private Sub UserForm_Initialize()
    Dim t As Integer, i As Integer
    Sheets("マクロ").Select
    For i = 1 To 11
        t = IIf(i = 6, t + 3, IIf(i = 7, t + 2, t + 1))
        Controls("combobox" & i).RowSource = Chr(65 + t) & "6:" & Chr(65 + t) & _
                    IIf(i < 6, 1004, IIf(i < 9 Or i = 11, 10, 30))
        Controls("combobox" & i).ListRows = IIf(i < 3, 50, IIf(i < 6 Or 8, 10, 5))
    Next i
    TextBox1.SetFocus
 End Sub


弥太郎さん、ありがとうございます。
 が・・ぜんぜん意味がわかりませんでした。
 最初の式に対する回答かと思われるのですが、
 いただいた分をVBAに貼付けしてもデータが
 施設データに飛びません。
 どうしてでしょうか?

 一番いただきたかったのは、コメントにも記載
 している後半の部分ですが、やはり難しいのでしょうか?

 あ、いや、あれはスレ上げするためだけのレスでして、あんさんの問いに対する回答
 ではありまへん。
 ただ、ついでにそれぞれのコードを短縮する為の見本を書いただけなんですワ(汗
 識者の回答をお待ち下され。
      (弥太郎)
 追伸
 あのぅ、それがしもう年なんであまりあれこれ問われるとついていけまへんねん。^^
 ごめんなはれや。


弥太郎さん、お気遣いありがとうございます。
 回答いただければと思ってますので、どなたかよろしく
 お願いいたします。

 良く分かっていませんが
 >フィルタオプションの設定がいいのかなとも思いましたが、
 >末尾ではなく文頭で検索、抽出する方法があればいけそうな気もします。
 >(番号の先頭文字が1であるものを全て抽出する。)
 これで良いなら

 Sheet1
	[A]	[B]		[C]	[D]		[E]	[F]		[G]
[1]	(番号)	施設名		構造	建設年月日	数量	金額		摘要	
[2]	1	公園用土地	土地	S45.1.1		500u	5,000,000			
[3]	1.01				S46.1.1		50u	500,000		購入
[4]	1.02				S48.1.1		-100u	-3,000,000	売却による一部減	
[5]	2	公会堂		木造	S50.4.1		130u	1,500,000		
[6]	2.01			鉄筋	S55.4.1		150u	2,000,000		増築
 Sheet2
	[A]	[B]		[C]	[D]		[E]	[F]		[G]
[1]	検索値									
[2]	1	TRUE								
[3]										
[4]										
[5]	(番号)	施設名		構造	建設年月日	数量	金額		摘要	
[6]	1	公園用土地	土地	S45.1.1		500u	5,000,000			
[7]	1.01				S46.1.1		50u	500,000		購入
[8]	1.02				S48.1.1		-100u	-3,000,000	売却による一部減	

 Sheet2のB2には
=INT(Sheet1!$A2)=$A$2
 の式を入れます。
 Sheet2のA2に、抜き出したい番号(親番)を入れます。

 Sheet2を選択した状態で、
  メニュー・データ(D)→フィルタ(F)→フィルタオプションの設定
   リスト範囲(L)   [ Sheet1!$A:$G ]
   検索条件範囲(C) [ $B$1:$B$2    ]
   抽出範囲(T)     [ $A$5:$G$5    ]
 この設定で抽出を行うと、上記結果になります。

 もしも、結果を結果のみのシートに出したい場合は
 結果を出したいシートから、設定を行ってください。

 例えば、Sheet1にデータがあり、Sheet2に条件を書き
 Sheet3に結果を表示したい場合は、
 Sheet3を選択した状態から、フィルタオプションの設定を開き
 リスト範囲(L) 検索条件範囲(C) 部分をシート間参照させます。

 (HANA)

 ・・・と書きましたが、なんだかなさりたいことと違っていますね。

 言葉だけで説明するのではなく、
 何処にどの様に表示したいのか、
 実際に配置して載せてみるのが良いと思いますよ。

 御提示の表は、実際の表から省略なさって居られる様ですし
 何を指定してどの様に表示したいのか・・・・
 結果図はまだ載せて居られませんよね?

 >それがしもう年なんであまりあれこれ問われるとついていけまへんねん。^^
 ってことですので、なさりたいことを明瞭に伝え
(実際にどの様なデータがあるのか。
 そこから、どの様に表示したいのか。)
 分からない所を絞り込んで質問していくと
 きっと役立つ情報を 教えて下さると思いますよ。

 (HANA)

ありがとうございます。かなり詳しく書いたつもりですが(転写先の
 セルも詳細に書いてますし・・)、これ以上詳しくとなるとエクセルの
 ファイルを添付するくらいしかないのではないでしょうか?
 列毎にどのデータをどのセルに反映させたいかも書いてますし、
 逆にどう記載すれば分かってもらえますか??

 本当はエクセルを添付したいですが、できないみたいなのが残念です。


 えっと・・・「目で見て分かるように」ですかね。

 ですが、まずは 何処まで出来ていてどの部分が分からないのか
 分からないのでまとめてみるのはどうでしょう。

 ・・・分からない部分を書いて居られるのでしょうけど
 今の状態ですと、壮大すぎてレスもつきにくいと思います。

 親番号で抽出は既に出来ていて
 それらのデータを所定の位置に表示させるところが出来ない
 と言う事なのですかね?

 (HANA)

おはようございます。
 HANAさんのいわれることがなんとなくわかりました。
 あとで書いてので、見ていただければと思います。
 よろしくお願いします。

今の状況を記載します。
 1.入力表のユーザーフォームは上記のとおりです。(コマンドボタンを押すと
     マクロのシート(後述)3行目にデータをいったん飛ばし、そこから施設
     データのシート6行目以降にデータを飛ばします。
  2.マクロのシートの状況(横長にできないので複数段書きになりますが、省略なしで記載します。)
     B列    C列     D列   E列  F列   G列    H列       
      (施設番号)(施設枝番)(施設名称)(所在地)(構造)(委託年月日)(数量)
     I列   J列  K列     L列     M列     N列     O列 
    (単位) (価格)(建設根拠)(建設年次@)(建設年次A)(委託番号)(監査年月日)
     P列    Q列
       (契約種別 (摘要)
     ※施設番号、施設枝番・・0から始まる3桁数字(001〜999まで)
     ※D列〜F列、I(m、u等)、K列〜Q列までは文字、G・H・J列は数字です。
  3.施設データシートの状況
    E2列目:出力したい施設番号を入力(たとえば1等)
       F2列目:オートフィルター用の検索番号(式は=IF(LEN(E2)=1,"00"&E2,IF(LEN(E2) 
        =2,"00"&E2,IF(LEN(E2)=3,""&E2,"")))
       列項目は2のマクロシートと同じでユーザーフォームで出力されるデータは
       6行目から。(上記ユーザーフォームで式がおかしい場合は教えてください。要は
       6行目からデータを飛ばし、その次からは常に1行下にデータを飛ばします。) 
       入力したデータは台帳印刷というボタンを押すとF2列目の指定された施設番号
       データのみを転記シートに写し、台帳シートに飛ばします。
       (上記にも記載しましたが、作りかけのVBAを下記に再掲します。これをどう
         作っていいのかがわからない状態です。)   
    Sub Macro1()

Application.ScreenUpdating = False

    Sheets("施設データ").Select
    Range("B5:q5").Select
    Selection.AutoFilter
    Dim tes1
    tes1 = Range("f2")
    Selection.AutoFilter Field:=1, Criteria1:=tes1
    Range("b6:q1000").Select
    Selection.Copy
    Sheets("転記シート").Select
    Range("B6").Select
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False
    Range("A1").Select
    Selection.ClearContents
    Sheets("施設データ").Select
    Selection.AutoFilter
    Range("A1").Select
    Selection.ClearContents

    Sheets("転記シート").Select
    Range("g6:j16").Select
    Selection.Copy
    Sheets("台帳").Select
    Range("i8").Select
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False

    Sheets("転記シート").Select
    Range("g17:j26").Select
    Selection.Copy
    Sheets("台帳").Select
    Range("n8").Select
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False

    Sheets("転記シート").Select
    Range("n6:n16").Select
    Selection.Copy
    Sheets("台帳").Select
    Range("d20").Select
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False

End Sub

  4.転記シートの状況
      列項目は施設データシートと同じ、行も同じ。(転写用で6行目以降に選択した
      施設番号のデータを飛ばします。)
  5.台帳シートの状況
      転記シートを経由してここにデータを飛ばしたいのですが、下記条件で飛ばしたいです。
      (飛ばしたいセル番号は上記に記載したので、そちらを見ていただければと思います。)
      施設番号:抽出データは全て同じ番号になる。
      施設枝番:001〜
      施設名称、所在地、構造、委託年月日、建設根拠、監査年月日は異動する時もあるし、
      ないときもある。(枝番によって、ない時がある。)
       → 最新のデータ(抽出した一番下のデータ)、二番目に新しいデータ(一番下から
            からひとつ上のデータ)、三番目に新しいデータ(一番下からふたつ上のデータ)
            をそれぞれ飛ばす事は可能でしょうか?

      台帳にどのように飛ばすか、飛ばす先は上記のコメントに記載しておりますので、
      あわせてみていただければと思います。

      よろしくお願いします。

 そもそも、そのブックにはどの様なシート名のシートが
 何枚有るのですか?
   マクロのシート :作業用シート
   施設データシート:データ蓄積シート
   転記シート   :印刷データ抽出結果シート
   台帳シート   :印刷シート
 ですかね?

 それで、マクロのシートを介して施設データシートに
 データを蓄積していくのは出来ているのですよね?

 その後、「転記シートへデータの抽出」と「台帳シートへ印刷様式に当てはめる」
 の二つの作業が有ると思われますが
 「データの抽出」は出来るのですか?それともまだなのですか?

 まずは、二つを分けて考えてみてください。

 (HANA)

かなり詳しく書いたのですが、わかりませんか?
 シートは上記に書いたとおりです。(マクロ、施設データ、転記シート、台帳シート)
 マクロを介して施設データに飛ばすのも上記ユーザーフォームに書いているとおりです。
 データの蓄積はできています。

 何度も何度も書いておりますが、聞きたかったのは施設データから転記シートに飛ばした
 後、台帳にいかに反映させるかです。
 これも上記のとおりです。

 すいませんが、上記でかなり詳しく、何度も書いています。
 これ以上といわれるとファイルそのものを送付するしかないと思うのですが、どうですか??


こんばんわ。
 いろいろ聞かれて、その内容に詳しくお答えしたはずですが、
 放置でしょうか?

 誠実な回答をお願いいたします。

 分かりました。

 時間を作って、サンプルコードコードを作ろうかと思っていましたが
 お待ちになれないようですので、私は降りることにします。

 私はまだ、どういったことをなさりたいのか把握できても居ません。
 ご説明から、おおよそこのことは分かった様な気がしますが
 コードを作るまでにはもう少ししっかり理解したい所です。

 他の【誠実な】方の回答をお待ち下さい。

 (HANA)

>どういったことをなさりたいのか・・・
  → ではどこまで書けばいいのでしょうか?
       一言一句とはいいませんが、ほぼ全てを記載したつもりです。
       正直上記でわからないということでしたら、ファイルを見ていただく
       以外の方法が思いつきません。

  いろいろ聞いていただくのは構いませんが、同じような事を何度も聞かれても
  上記のとおりと回答するしかありませんし、シートの数も書いたつもりです。
   何度同じ事を書けば分かっていただけるのでしょうか???

 伝えるのって難しいですよね〜
 伝える側は、自分で見てわかっているから何処かで伝えきっていない事があるのかもしれませんね。
 
 どうです、ここは全く何にも知らない人(友達でも知り合いでも)に、上記を文章だけで説明されてみては?
 思っていたことが全て伝わったのなら、聞き手に理解力がないのかもしれません。
 (HANAさんの事ではないですからねw)
 伝わらなかったのなら、伝える側に忘れ物があるのかもしれません。
 
 >放置でしょうか?
 >誠実な回答をお願いいたします。
 そうそう、ここは学校ですが、回答をなさってくれている方々は、ボランティアで回答してくれています。
 ここに、専任の先生がいるわけではありません。
 回答くださっている、または何かしらの書き込みをしてくださっている人は、そのための時間を消費して下さっているのを忘れずに〜
 掲示板(文字の社会)ですから、言葉も選んだほうがいいですね^^
 (σ(^o^;)も、書いた後すぐに後悔します・・・)
 
 σ(^o^;)は、難しい事はわかりませんし、内容も把握できていませんのでごめんなさいmm
 スレを汚して、ごめんなさいね〜
 (キリキ)(〃⌒o⌒)b

 何度も同じ説明をさせてしまった様で、ごめんなさいね。
 でも、ここまで聞いたので何となく分かったのです。
(まだ、何となく ですけど・・・。)

 おそらく、ファイルを渡されても分からないと思います。
 複雑で作り方が分からないから、こちらへ御質問に来られたのですよね?
 でしたら、状況が伝わりにくいのは仕様が無いのではないでしょうか?

 私も、理解しようと努力をしていない訳では有りません。
 なるべく時間を作って、書いて下さった事を何度も読み返しています。
(それで、何となく分かりかけたので、今晩にでももう一回詰めてから
 コードを書いてみようかとは思っていたのですが。。。。)

 でも これでは足りないようですので・・・・
  (ふふふ、理解力が無いのでしょうね。)
 他の方がご覧になって 分かる方が居られましたら
 その方からコメントが有ると思います。

 この掲示板は沢山の方が見て居られます。
 他の方の質問を見ていただければ 沢山の方が
 コメントをしているのはお分かりかと思います。
(それが、重複する内容であっても ですよ。)

 それでも、このスレに今現在私しか居ないのは何故でしょう?
 もしも貴方が「私が居るためだ」と思われると申し訳有りませんので
 私は降ります。

 本当は24時間でもかけて この問題に当たれれば良いのでしょうけど
「じっくり時間がとれる時」と言うのが どうしても、
 夜遅くから寝るまでの間 位の時間になってしまいますし
 日によってはその時間もとれるとは限りませんので。

 (HANA)

 やっぱりレスがつかないみたいですね・・・。
 まだ見て居られますでしょうか?

 私は↓の質問をしましたよね?
 >その後、「転記シートへデータの抽出」と「台帳シートへ印刷様式に当てはめる」
 >の二つの作業が有ると思われますが
 >「データの抽出」は出来るのですか?それともまだなのですか?
 これは、どうなのか「分からない」から聞いたのです。
 これに対する、エクセルさんのご返答は
 >施設データから転記シートに飛ばした後、台帳にいかに反映させるかです。
 という、今までと変わらないご返答です。

 私が聞いたのは、二つを分けて考えたときに、どちらまで出来ていますか?
 ですよ。それを「この一連が出来ていない」と言うお答えでは
 答えになっていませんよね?

 でも「転記シートへデータの抽出」は出来ているのではないのですか?
 また、「台帳シートへ印刷様式に当てはめる」の部分も
 単純な転記部分は記録から得られるので 最初に「この部分を教えて欲しい」
 と書いている場所でも「自分でコードが出来ている場所も有る」って事ですよね?

 それらを明確にしてもらうための質問だったのです。
 ただ、エクセルさんからはそれらのご説明はなく
 既に書いてあることの繰り返しでしたので、私は貴方の文章から
 貴方が何処まで出来ているのか。また、何処までは出来そうなのか
 把握する必要が有ると思いました。

 >私はまだ、どういったことをなさりたいのか把握できても居ません。
 これは、書いて下さったことを理解するのに【時間が必要だ】と言う事です。
 「足りないから、まだ書きなさい!!」と言うのではなく。
(だって、これは「もう書いたでしょ」と言う答えしか頂けない様ですので。)

 理解するのに勤めている状態なのに
  つまり、【放置している訳ではなく】、書いて下さったことを
  理解しようと私の出来る範囲で【誠実】に努力をしている最中に
 >放置でしょうか?
 >誠実な回答をお願いいたします。
 なんて言われたら、どう思いますか?

 先にも書いておりますが 自分の時間のとれる時に書き込みを確認し
 それを理解し、コメントをしています。
 生業としてそれをしているのではない と言う事は、ご理解下さい。

 さて、結局あれ以来見ていませんので(エクセルさんがまだ見て居られるかも分かりませんし)
 この前「この考えで行けば良いんじゃないか?」と思った方法の概要を書いてみます。
 実際はなさりたいことと違うかもしれませんし、VBAでは出来ないことかもしれませんが
 その辺りは、詰めてみてください。

 B:C列は単純な転記だと思っていますので、コードは記録マクロで得られると思います。
 D列は、施設の名称の有る列を、最終行から.End(xlUp)で確認すれば良いと思います。
 E:F列は、カウンタを設けて、下側のセルから一つずつ値が入っているか確認。
     カウンタが規定の数に成ったら終了です。
     或いは、値が入っているセルが一つ見つかったら、一つ上のセルを確認し
     値が入って居ない場合は、.End(xlUp)で上がっても良いかもしれません。
 G列は、難しければ一度どこかのセルに SMALL関数を使って小さい順に詰めて表示し
     その後は単純な転記をすれば良さそうに思います。

 (HANA)

>D列は、施設の名称の有る列を、最終行から.End(xlUp)で確認すれば良いと思います。
 E:F列は、カウンタを設けて、下側のセルから一つずつ値が入っているか確認。
     カウンタが規定の数に成ったら終了です。
     或いは、値が入っているセルが一つ見つかったら、一つ上のセルを確認し
     値が入って居ない場合は、.End(xlUp)で上がっても良いかもしれません。
 G列は、難しければ一度どこかのセルに SMALL関数を使って小さい順に詰めて表示し
     その後は単純な転記をすれば良さそうに思います。

 すいません、この式の作り方がわからないのです。
 すいませんが、教えてください。
 よろしくお願いします。

 例えば、転記シートに↓の状態でデータが有ったとします。
	[C]	[D]	[E]	[F]
[1]	枝番	名称	所在地	構造
[2]		あ		
[3]	1		A	
[4]	2			イ
[5]	3	い		
[6]	4			ロ
[7]	5			
[8]	6		C	ハ
[9]	7		D	
[10]	8			
[11]	9			
[12]	10			
 ・・・実際に同じ表を作って確認して頂けるのが良いと思いますが
 例えば、D12セルを選択して、Ctrl + ↑ を押すと
 アクティブセルはD5セルまで移動します。

 このキー操作は、上方向へ移動するのですが
  アクティブセルが空欄だった場合は最初に入力があるセル
  何か入力が有った場合は、データが途切れる先頭セルまで
 移動します。

 これをマクロに記録にとると
    Range("D12").Select
    Selection.End(xlUp).Select
 と言うコードが出来ています。

 >最終行から.End(xlUp)で確認
 記録にとったコードは、D12セルから上方向へ捜す物です。
 最終行は、2003迄は65,536 ですが 2007は行数が変わって仕舞うので
 Rows.Count で取得します。

 Sheets("転記シート").Range("D" & Rows.Count).End(xlUp)
 これで、転記シートのD列最終行から上方向へ捜し
 一番最初にデータが有ったセル を求められるので
(もちろん、最終行のセルにデータが無かった場合ですけどね)
 この値を、台帳シートのF4セルに入れます。

 Sheets("台帳").RANGE("F4").Value = Sheets("転記シート").Range("D" & Rows.Count).End(xlUp).Value

 >値が入っているセルが一つ見つかったら、一つ上のセルを確認し
 >値が入って居ない場合は、.End(xlUp)で上がっても良いかもしれません。
 以下は、E列に関するコードです。

 E列は3回なので、このくらい書いても良いように思います。
    Dim S1R As Long, S2R As Long, S3R As Long
    With Sheets("転記シート")
        '最新データ
        S1R = .Range("E" & Rows.Count).End(xlUp).Row
        Sheets("台帳").Range("J5").Value = .Range("E" & S1R).Value

        '一つ古いデータ
        If S1R > 2 Then
            If .Range("E" & S1R - 1).Value <> "" Then
                S2R = S1R - 1
            Else
                S2R = .Range("E" & S1R).End(xlUp).Row
            End If
            If S1R <> 1 Then
                Sheets("台帳").Range("J4").Value = .Range("E" & S2R).Value
            End If
        End If

        '二つ古いデータ
        If S2R > 2 Then
            If .Range("E" & S2R - 1).Value <> "" Then
                S3R = S2R - 1
            Else
                S3R = .Range("E" & S2R).End(xlUp).Row
            End If
            If S3R <> 1 Then
                Sheets("台帳").Range("J3").Value = .Range("E" & S3R).Value
            End If
        End If
    End With

 F列も・・・と書きましたが、こちらは上から順に表示されれば良い様ですし
 数も多いのであまり現実的ではないでしょうね。
 G列の事もふまえて考えると
 「そもそも、転記シートに空白行を含まない形で転記すれば良いのでは?」
 と言う気がしますが。

 例えば・・・・検索値を入れるセルの位置が変わりますが
 施設データ ↓の様な状態だったとき
	[A]	[B]	[C]	[D]	[E]	[F]	[G]
[1]	検索値	番号	枝番	名称	所在地	構造	年月日
[2]	1	1		あ	A	イ	S45.1.1
[3]		1	1				
[4]		1	2				S46.1.1
[5]		1	3	い			
[6]		1	4			ロ	
[7]		1	5				
[8]		1	6		C	ハ	
[9]		1	7		D		
[10]		1	8				S50.1.1
[11]		1	9				
[12]		1	10				
[13]		2		ああ	AA	イイ	S50.4.1
[14]		2	1				
[15]		2	2		BB		
[16]		2	3				
 B列のオートフィルタで、検索値を絞り込んだ後 <これは、今できているコードです>
 B:G列を選択してコピー、転記シートのB1セルから貼り付け <↓以降が追加部分>
 施設データシートに戻り、F列のオートフィルタで(空白以外のセル)で絞り込み
 F列を選択してコピー、転記シートのF1セルから貼り付け
 施設データシートに戻り、F列のオートフィルタを全て表示
 G列のオートフィルタで (空白以外のセル)で絞り込み
 G列を選択してコピー、転記シートのG1セルから貼り付け
 すると、↓の様に成るはずです。

 転記シート
	[B]	[C]	[D]	[E]	[F]	[G]
[1]	番号	枝番	名称	所在地	構造	年月日
[2]	1		あ	A	イ	S45.1.1
[3]	1	1			ロ	S46.1.1
[4]	1	2			ハ	S50.1.1
[5]	1	3	い			
[6]	1	4				
[7]	1	5				
[8]	1	6		C		
[9]	1	7		D		
[10]	1	8				
[11]	1	9				
[12]	1	10				
 この様になっているとF列やG列のデータを 台帳の所定の位置に貼り付けるのは
 記録から得られたコードでも出来ますよね。

 もちろん、E列も空白セルを無くして上から詰まった状態でデータが有れば
 上下を入れ替えて転記するのも
 もう少し短いコードで出来るようになりそうに思います。

 (HANA)

皆さん、見つかりました。
 ありがとうございます。
 ですが、上にある「最新データをコピーする」式が
 機能していません。これは正しんでしょうか??
 行いたいことは
 ・転記シートのE列の最新データを台帳シートF列3行目に転写
 ・転記シートのE列の次に新しいデータを台帳シートのF列4行目に転写
 ・転写シートのE列の2番目に古いデータを台帳シートのF列5行目に転写です。
 最新かどうかは枝番で判断することになると思いますが・・・。

 上記処理ができるマクロを教えてください。
 よろしくお願いします。

 こちらの質問は放置?
[[20080709173305]]『過去ログについて』(エクセル)  

 私は
 >ありがとうございます。フィルタオプションの設定がいいのかなとも思いましたが、
  ・・・・(中略)・・・・
 >とりあえずしたいことを書いてみますね。
 で御提示のサンプルの様に、データが入っていると想像しています。

 例えば「構造」の部分は 1.01や1.02の様に
 『入力がない場所もある』ので
 その他の情報も含め私が想像したサンプルデータが
 > 施設データ ↓の様な状態だったとき
 のデータです。

 番号は隙間無く入力があり、枝番は0番目は入力が無し。
 枝番の順番が入れ替わることは無い。
 その他、番号の最初は全ての列にデータが入力してあるが、
 枝番1番目以降のデータは 変更が有った場所のみデータがあり
 全ての列にデータが有るわけではない。

 と言う物です。

 前に御提示のマクロコードから
「検索番号のみのデータを 転記シートに転記は出来ている」
 と思っています。
 ですから、転記シートのデータを
 >例えば、転記シートに↓の状態でデータが有ったとします。
 の様な状態にするところまでは出来ていると思っています。

 前のご説明に
 > E列・・・所在地。
 >          最大3行で、J3〜J5に飛ばしたいのですが、住所に変更が
 >          ない場合はJ5だけに、途中で1回変更がある場合は最新を
 >          J5に、ひとつ古いデータをJ4に、途中で2回変更があった
 >          場合はふたつ古いデータをJ3に飛ばしたいです。
 >          (2回以上変更がある場合は2回変更があったものと同じ処理)
 と有りますから、このマクロを実行すると 台帳シートは

 台帳	[J]
[3]	A
[4]	C
[5]	D

 の様になります。

 最新のデータ(一番下に出てくるデータ)が J5 に
 一つ古いデータ(その上に出てくるデータ)が J4 に
 二つ古いデータ(更にその上に出てくるデータ)が J3 に
 転記されると思います。

 ご説明通りの物を作ったと思っていますが
 >上にある「最新データをコピーする」式が機能していません。
 と言う事は、私の思いと そちらの思いが何か違うのでしょうね。

 (HANA)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.