[[20100510120539]] 『シートの数字を読み取り他のシートに』(ヨシ) ページの最後に飛ぶ

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

 

『シートの数字を読み取り他のシートに』(ヨシ)

シート1(入力用)の、A1に120と入力されています、B1には時間で20分が入力されています。
シート2(120)というシートに、シート1から持ってきてこのシートに時間を自動的に入力したのですが方法はありますか?

他にもシートが沢山あるので、入力用にいれたらそこのシートに自動で入力されるようにしたいのです。

詳しい方がおりました教えて頂きたいのですが。


 120!A1=IF(入力用!A1=120,入力用!B1,"")
 のように、各シートに条件で入れていく・・・という事ではないのでしょうね?
 違う値に書き換えた時は(例えばA1を130とかにした場合)は120のシートの値は消えて良い?

 ちょっとやりたい事が見えないです。
 (momo)

やりたいことは各シートに条件をいれれば入力シートに、入力されればいきますね。

入力シートの値は、次に入力したら消えていいんです。

これで出来たのですが、教えて頂いたマクロが起動しなくなってしまいます。

(ヨシ)


 入力シート
  A      B
 100	20
 110	10
 120	25
 130	30
 120シート  
 A1:=IF(COUNTIF(Sheet1!$A$1:$A$100,120)=1,VLOOKUP(120,Sheet1!$A$1:$B$100,2,0),"")
 他のシートも同様

 >教えて頂いたマクロが起動しなくなってしまいます
 ご質問の中には特にマクロの記述はありませんが、マクロはどんなものですか?
 (momo)


マクロは以前、momoさんに教えて頂いたものです。

Private Sub Worksheet_Change(ByVal Target As Range)

  Dim buf As Variant
  If Target.Count > 1 Then Exit Sub
  If Not Application.Intersect(Target, Me.Range("C5:C12")) Is Nothing Then
    Application.EnableEvents = False
    Select Case VarType(Target.Value)
      Case vbString
        If StrConv(Target.Value, vbNarrow + vbLowerCase) = "bs" Then
          If Target.Offset(, 1).Value = "" Then
            Target.ClearContents
          Else
            Application.Undo
            buf = Split(StrReverse(Target.Offset(, 1).Value), ",", 2)
            Target.Value = Target.Value - CDbl(StrReverse(buf(0)))
            Target.Offset(, 1).Value = StrReverse(buf(1))
          End If
        Else
          Application.Undo
        End If
      Case vbDouble
        buf = CDbl(Target.Value)
        Application.Undo
        Target.Value = Target.Value + buf
        Target.Offset(, 1).Value = Target.Offset(, 1).Value & "," & buf
      Case vbEmpty
        Target.Resize(, 2).ClearContents
    End Select
    Application.EnableEvents = True
  End If
  End Sub

このマクロに、教えて頂いた関数を入力すると動かなくなってしまいます。

また面倒なことになりますよね(汗)
 (ヨシ)


 ん〜関連性が良くわかりません。
 このコードはどのシートで使われていますか?
 そのシートのC5:C12の範囲と今回の質問のセルは関係があるのですか?

 (momo)

シートの(C5:C12)は関係ございません。

私が使用しているものですので、マクロは同じセルの中で、積算されていくものですで隣に履歴が残るようになっています。

入力用のシートに時間と工程を入力すると、他のシートに移したいだけなのですが、シートが沢山あるので入力用のシートを作成したのです。

マクロを使用していても、関数を入力してもどてらも起動するようにしたいのです。(ヨシ)


 >このコードはどのシートで使われていますか?
 の回答がありませんが、なんというシートで使っていますか?
 また、各数字名のシートで時間を表示させたいセルはどこですか?

 ヨシさんのシートを回答者が作れるだけの情報を下さい。
 私の読解力が足りないのもあると思いますが、ほとんど現状が理解できていませんです。
 (momo)

入力用のシート

       C列     D列
5列目  無作業コード    時間
       130      20分

とあります、無作業コードはリストになっていて、110〜320までのリストがあります。

他にシートが、110〜320まであるのでシートがあるので探して入力するのが大変ですので、入力シートを作成しました。
110〜320のシートに、教えて頂いたマクロが入っています。

マクロを使用しているので関数が入りませんということです。

入力用シートに、毎回時間を同じところに入力するので消えても構いませんが、他のシートにはきちんと残しておきたいのです。(ヨシ)


 ん〜 ごめんなさい、全然状態がわかりません。
 こんな事かな? と思うことをコードにしたものを載せてみます。
 入力用シートのモジュールに

  Private Sub Worksheet_Change(ByVal Target As Range)
  If Application.Intersect(Target, Me.Range("C5:D12")) Is Nothing Then Exit Sub
  If Me.Range("C" & Target.Row).Value <> "" And _
     Me.Range("D" & Target.Row).Value <> "" Then
    Worksheets(CStr(Me.Range("C" & Target.Row).Value)).Range("C" & Target.Row).Value = _
      Me.Range("D" & Target.Row).Value
  End If
  End Sub

 という事でいいのでしょうか?

 依然として、どのシートのどこにどんなデータがあって、
 どこに何をどうしたいのかが解っていません。
 私の前にあるシートは真っ白のままです・・・
 (momo)

 数式の場合は、入力用シートを参照するので、入力用シートを消せません。
 下に追加する形で入力していきます。

 マクロの場合は、入力した値をそれぞれのシートに転記するので、転記後は入力用シートを消せます。

 数式は、事前にそれぞれのシートに入力しておきます。
 マクロは、入力時にそれぞれのシートに転記します。
 両方使用すると、マクロが数式を破壊(上書き)します。
 (名無し1号)

そうです!!

こんな感じにいたかったです。

しかし、入力シートで時間を入力すると、入力シートで入力した時間は表示されません。
選択したコードのシートには時間が入りますが時間はダブって入力されしまいます。


入力用シートに20分と入力すると・・・入力シートに時間が表示されない
入力用シートに20分と入力すると・・・選択したシートの時間がダブって入る
                   20と20で40分入ってしまう。
履歴を隣に残していて、履歴側に20で、作業時間側に、40分と表示されてダブってしまいます。(ヨシ)


 どうしたいのでしょうか・・?
 選択シートの方のマクロは使っているのですか?
 最初のマクロはそのまま使いたい。
 でも入力用シートから転記した場合はダイレクトに入力した形にしたい。
 という事かな?

  Private Sub Worksheet_Change(ByVal Target As Range)
  If Application.Intersect(Target, Me.Range("C5:D12")) Is Nothing Then Exit Sub
  Application.EnableEvents = False  '★追加
  If Me.Range("C" & Target.Row).Value <> "" And _
     Me.Range("D" & Target.Row).Value <> "" Then
    Worksheets(CStr(Me.Range("C" & Target.Row).Value)).Range("C" & Target.Row).Value = _
      Me.Range("D" & Target.Row).Value
  End If
  Application.EnableEvents = True   '★追加
  End Sub

 という事かしら?
 (momo)

 どちらも作業は大丈夫ですが、今度は選択されたシートに数字がいくと積算されなくなってしまいました。
 どうすれば直りますか?(ヨシ)

 積算するのなら2つ前ので大丈夫だと思うのですが・・・
 シートのレイアウトもわかりませんし、なさりたい事が私にはわからないです。
 (momo)

 2つ前のですと先程書いたようになってしまうのです。
 やり直しをしてみましたがダメです。同じく表示されず積算も上手くいきません。

(ヨシ)


 momoさんエクセルシートを見ていただけませんか?(ヨシ)

 >見ていただけませんか?
 見るというか、シートレイアウトを教えていただくのと私の質問に答えて頂ければ十分なのですが
 たとえば

 Sheet1	[A]	[B]	[C]	[D]	[E]
 [1]					
 [2]					
 [3]					
 [4]					
 [5]					
 [6]					
 [7]					
 [8]					
 [9]					
 [10]					

 こんな感じでシートのレイアウトを示していただくとか。
 (momo)

 入力用Sheet	[A]	[B]	[C]	[D]	[E]
 [1]		             2010/5			
 [2]	    作業者名	作業コード 作業時間	
 [3]					
 [4]					
 [5]					
 [6]					
 [7]					
 [8]					
 [9]					
 [10]

 110Sheet	[A]	[B]	[C]	[D]	[E]
 [1]		             2010/5			
 [2]	        作業者名	作業時間	作業時間履歴
 [3]					
 [4]					
 [5]					
 [6]					
 [7]					
 [8]					
 [9]					
 [10]

 入力Sheetの作業コードはリストになっています。
 110Sheet以外にも320Sheetまで沢山あります。
 マクロを入れてあります。
 これで分かりますか?
 (ヨシ)	

 実際のデータをどこにどう入力したらどうなって欲しいのか。
 というのが重要な情報なのです。

 たぶんですが、それがわかれば全然違ったアプローチになるような気がしています。
 (momo)

 入力用Sheet [A]       [B]        [C]         [D]       [E] 
 [1]		           2010/5			
 [2]	            作業者名   作業コード 作業時間	
 [3]		    ヨシ1   110     20分
 [4]		  ヨシ2   130	 50分	
 [5]					
 [6]					
 [7]					
 [8]					
 [9]					
 [10]
 110Sheet  [A]     [B]    [C]     [D]       [E] 

 [1]		             2010/5			
 [2]	        作業者名	作業時間	 作業時間履歴
 [3]           ヨシ1    20分    20					
 [4]		    ヨシ2    		
 [5]					
 [6]					
 [7]					
 [8]					
 [9]					
 [10]
 110Sheet  [A]     [B]    [C]     [D]       [E] 

 [1]		             2010/5			
 [2]	        作業者名	作業時間	 作業時間履歴
 [3]           ヨシ1			
 [4]		    ヨシ2    50分    50			
 [5]					
 [6]					
 [7]					
 [8]					
 [9]					
 [10]

 という感じにしたいのです。(ヨシ)


 表はだいたい解りました。
 前回と違って3行目からになったのですかね?前回も今回載せているコードも5行目からですが・・・

 で、各数字のシートの方は手入力はしないという事ですか?

 あと積算は必要との事ですが、履歴を残しての積算は必要ですか?
 (つまり元に戻す事はありますか?)
 履歴を使って元に戻す場合はどこにどのように入力しますか?

 このシートたちの使い方と、ヨシさんが行う作業と望む結果を
 順序立てて説明お願いします。

 あと、少し気になっていますが上の表のとおりで掲示されたコードのままですと
 >If Not Application.Intersect(Target, Me.Range("C5:C12")) Is Nothing Then
 ここのC5:C12という範囲を変更したら動く。なんて事はないですか・・・・?

 (momo)

 間違えました。

 五行目からです。(ヨシ)

 という事だけですと、まだ何も解ってない事になりますね。
 正確なシートレイアウトも必要ですし
 それ以前に、私からの質問の回答も頂けないと私は回答のしようがありません。

 現状で回答してくださる方がいらっしゃれば良いですが。

 (momo)

 各数字のシートの方は手入力はしないという事ですか?
 回答:各数字(コード)のシートに手入力しないのは、
 作業コードが多すぎて探すだけで時間がかかるので時間短縮のためです。

 あと積算は必要との事ですが、履歴を残しての積算は必要ですか?
 回答:積算はシートの時間が一目で分かるようにしたいからです。
    履歴を残すのは、入力で間違えがあった場合に戻れるようにしたいからです。

  (つまり元に戻す事はありますか?)
 回答:戻す理由は上記に書いた通りです。

 履歴を使って元に戻す場合はどこにどのように入力しますか?
 回答:履歴を元に戻すのは、各数字(コード)のシートに残したいのです。
    残す場所は、D5〜D12残したいのです。
    
 このシートを使ってしたいことは、無作業コード別の時間管理です。
 項目別に分けることで、無作業コードでどこに時間がかかっているかを知るためです。

 入力用シートのB5〜B12までは作業者の名前が記入されています。
 入力用シートのC5〜C12までは、リストが入っていて、無作業コードが110〜320まではいっています。
 入力用シートのD5〜D12までは、時間を入力したいのです。
 ここは時間を1度入力したら、次に入力するときは積算されなくていいのです。

 各数字(コード)シートのB5〜B12までは作業者の名前が記入されています。
 各数字(コード)シートのC5〜C12までは、入力シートで入力された時間が入力されるようにしたいのです。
 積算されるようにしたいのです。
 各数字(コード)シートのD5〜D12までは、入力シートで入力された時間の履歴を残したいのです。

 以上がやりたいことです。

 内容の説明もせず申し訳ございませんでした。お力をお貸し頂ければと思います。
 (ヨシ)


 回答ありがとうございます。
 回答からすると、履歴から元に戻す作業は手作業で。という事ですね?

 上の仕様に忠実にコード化すると以下のようになります。
 各数字のシートにある前回のコードはすべてコメントアウトなり削除してください。
 入力用シートのみに以下のプロシージャを貼り付けて確認してください。

  Private Sub Worksheet_Change(ByVal Target As Range)
  Dim myRow As Long, ws As Worksheet
  If Application.Intersect(Target, Me.Range("C5:D12")) Is Nothing Then Exit Sub
  myRow = myRow
  If Me.Range("C" & myRow).Value <> "" And _
     Me.Range("D" & myRow).Value <> "" Then
    On Error Resume Next
    Set ws = Worksheets(Me.Range("C" & myRow).Value)
    On Error GoTo 0
    If ws Is Nothing Then
      MsgBox "作業コードが間違っています。"
      Exit Sub
    End If
    With ws
      .Range("C" & myRow).Value = .Range("C" & myRow).Value + Me.Range("D" & myRow).Value
      .Range("D" & myRow).Value = .Range("D" & myRow).Value & "," & Me.Range("D" & myRow).Value
    End With
  End If
  End Sub

 (momo)

 ありがとうござます。

 履歴から元に戻す作業は手作業で。という事ですね?
 回答:手作業で戻すことになります。
    これも入力シートで直すことが出来ればいいのですが方法はあったら教えて頂けないでしょうか?

 言われた通りに、各数字(無作業コード)シートのコードは削除して、
 入力シートのみにコードを貼り付けましたが実行エラーになってしました。

 Rangeメソッドは失敗しました、Worksheetオブジェクトと表示されてしました。

 この部分です
 If Me.Range("C" & myRow).Value <> "" And _
      Me.Range("D" & myRow).Value <> "" Then

 どうすれば動くようになりますか?(ヨシ)


 あ、コードにミスがありました。(大チョンボ)

   myRow = myRow
 を
   myRow = Target.Row
 に修正してください。

 あと
 >これも入力シートで直すことが出来ればいいのですが方法はあったら教えて頂けないでしょうか?
 ですので
 >履歴を使って元に戻す場合はどこにどのように入力しますか?
 という質問をしたのですが・・・回答が
 >回答:履歴を元に戻すのは、各数字(コード)のシートに残したいのです。
     残す場所は、D5〜D12残したいのです。
 という事でよくわからないので反映していません。

 (momo)

 とりあえず、前回と同じように「bs」と入力したら1つ前の入力に戻す仕様です。

 作業コードに該当するシートが無い場合のエラー処理も入れてあります。

 D列入力の値が数値、「bs」、""以外の場合はエラー処理しています。

 前回と違って、履歴セルのみを変更して後で履歴セルの値を足してC列に表示します。

 前回は入力シートのD列を消した場合に数字シートの履歴を含めて全て消す仕様でしたが
 そこはコメントアウトしてますので必要なら実行可能にしてください。

 コードの貼り付け箇所は入力用シートのモジュール。
 その他のシートのイベントプロシージャは削除してください。

 あとは適宜修正して使ってみてください。

  Private Sub Worksheet_Change(ByVal Target As Range)
  Dim myRow As Long, i As Long, myCalc As Double
  Dim ws As Worksheet, CV As String, DV As Variant
  If Application.Intersect(Target, Me.Range("C5:D12")) Is Nothing Then Exit Sub
  myRow = Target.Row
  CV = Me.Range("C" & myRow).Value
  DV = Me.Range("D" & myRow).Value
  If CV <> "" And DV <> Empty Then
    On Error Resume Next
    Set ws = Worksheets(CV)
    On Error GoTo 0
    If ws Is Nothing Then
      MsgBox "作業コードが間違っています。"
      Exit Sub
    End If
    With ws
      Select Case VarType(DV)
        Case vbString
          If StrConv(Target.Value, vbNarrow + vbLowerCase) = "bs" Then
            If .Range("D" & myRow).Value <> "" Then
              .Range("D" & myRow).Value = StrReverse(Split(StrReverse(.Range("D" & myRow).Value), ",", 2)(1))
            End If
          Else
            MsgBox "時間入力が間違っています。"
            Exit Sub
          End If
        Case vbDouble
          .Range("D" & myRow).Value = .Range("D" & myRow).Value & "," & DV
        Case vbEmpty
          '.Columns("C:D").Rows(myRow).ClearContents
      End Select
      DV = Split(.Range("D" & myRow).Value, ",")
      For i = 1 To UBound(DV)
        myCalc = myCalc + CDbl(DV(i))
      Next i
      .Range("C" & myRow).Value = myCalc
    End With
  End If
  End Sub

 (momo)


ありがとうございます。うまく起動しました。

もう1つだけうまくいかないとこがあります。

入力用シートで、C列の無作業コードを選択して、D列に時間を入力するとちゃんと起動するのですが、次に入力するときに時間が入ったまま、別の無作業コードを選択すると、前回入力していた時間もそのまま反映されてしまいます。

どうすればよろしいですか?(ヨシ)


 時間を消してからコードを入力してください。

 面倒なら最後のEnd Ifの前にでも
 Me.Range("D" & myRow).ClearContents
 と入れておけば勝手に消えます。
 (momo)

この度は、本当にご迷惑をお掛けしました。

そしてありがとうございました。(ヨシ)


申し訳ないのですが、各数字シートに保護をかけようとすと読み取り専用のためエラーになってしまいます。
何か方法はございますか?

実行エラーになりデバックした部分です。

.Range("D" & myRow).Value = .Range("D" & myRow).Value & "," & DV

(ヨシ)


 こちらで回答が着いているので必要ないと思いますが
[[20100513222525]] 『マクロを使ったシート』(ヨシ)

 Protectメソッドのヘルプを見ると
 UserInterfaceOnlyという引数に

 UserInterfaceOnly      省略可能です。バリアント型 (Variant) の値を使用します。
 True を指定すると、画面上からの変更は保護されますが、マクロからの変更は保護されません。
 この引数を省略すると、マクロからも、画面上も変更することができなくなります。

 とありますので、ブックのオープン、クローズの時に設定してはどうですか?
 (momo)

コメント返信:

[ 一覧(最新更新順) ]


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