Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


12071 / 13645 ツリー ←次へ | 前へ→

【12397】入力規則 まぬた 04/4/2(金) 12:40 質問
【12419】Re:入力規則 まぬた@初心者 04/4/2(金) 17:30 質問
【12425】Re:入力規則 Asaki 04/4/2(金) 20:38 回答
【12427】Re:入力規則 まぬた@初心者 04/4/2(金) 21:29 質問
【12433】Re:入力規則 Asaki 04/4/3(土) 12:34 回答
【12458】Re:入力規則 まぬた@初心者 04/4/5(月) 10:04 質問
【12459】Re:入力規則 Asaki 04/4/5(月) 11:32 回答
【12463】Re:入力規則 まぬた@初心者 04/4/5(月) 12:41 お礼
【12500】Re:入力規則 まぬた@初心者 04/4/6(火) 13:55 質問
【12505】Re:入力規則 Asaki 04/4/6(火) 14:26 発言
【12507】Re:入力規則 まぬた@初心者 04/4/6(火) 15:57 質問
【12511】Re:入力規則 Asaki 04/4/6(火) 16:11 回答
【12518】Re:入力規則 まぬた@初心者 04/4/6(火) 17:33 質問
【12519】Re:入力規則 Asaki 04/4/6(火) 17:37 回答
【12521】Re:入力規則 まぬた@初心者 04/4/6(火) 18:27 発言
【12524】Re:入力規則 まぬた@初心者 04/4/6(火) 20:06 質問
【12528】Re:入力規則 Asaki 04/4/6(火) 22:30 回答
【12538】Re:入力規則 まぬた@初心者 04/4/7(水) 9:56 質問
【12539】Re:入力規則 Asaki 04/4/7(水) 10:00 回答
【12544】Re:入力規則 まぬた@初心者 04/4/7(水) 11:26 質問
【12546】Re:入力規則 Asaki 04/4/7(水) 11:37 回答
【12553】Re:入力規則 まぬた@初心者 04/4/7(水) 13:37 質問
【12508】入力規則(便乗質問) SHOW 04/4/6(火) 15:58 質問
【12509】Re:入力規則(便乗質問) Asaki 04/4/6(火) 16:05 発言
【12554】Re:入力規則 Asaki 04/4/7(水) 13:52 回答
【12557】Re:入力規則 でれすけ 04/4/7(水) 14:38 発言
【12560】普通の入力規則ですが..。 Jaka 04/4/7(水) 15:54 回答
【12561】Re:普通の入力規則ですが..。 でれすけ 04/4/7(水) 17:12 発言
【12562】Re:普通の入力規則ですが..。 Jaka 04/4/7(水) 17:15 発言
【12563】Re:普通の入力規則ですが..。 Asaki 04/4/7(水) 17:23 発言
【12569】入力規則 まぬた@初心者 04/4/7(水) 18:24 お礼
【12570】Re:入力規則 まぬた@初心者 04/4/7(水) 19:13 お礼

【12397】入力規則
質問  まぬた  - 04/4/2(金) 12:40 -

引用なし
パスワード
   うまく説明できるかわからないですが、、、宜しくお願いします。
データの入力規制でつくられたリストでの項目事にシートもそれ
ぞれ分けるとします。(例えば1.-▼1,2,3=シートタイトル1,2,3
2.-「1」のシートには「1」のみ選択されている)
「1」となっていた行をプルダウンで「3」に選択した時にその行
を丸ごと「3」のシートに移動させる方法を教えて下さいますで
しょうか。

【12419】Re:入力規則
質問  まぬた@初心者  - 04/4/2(金) 17:30 -

引用なし
パスワード
   ↑の質問をもう少し具体的に補足しますと、課題管理表として入力規則にて
課題(TODO)の現在の状態をOpen、Close、Suspendなどなどを各シートで分け
ます。その各シートで、状態が変化(Open⇒Close)した際にその属するシート
に課題が丸ごと自動的に移動する(OpenからCloseに変更したらOpenシートか
らCloseシートにうつる)ようにするにはどうしたらよいのだろうか、という
質問になります。以上、どうぞ宜しくお願い致します。

【12425】Re:入力規則
回答  Asaki  - 04/4/2(金) 20:38 -

引用なし
パスワード
   こんばんは。

多分、シートのChangeイベントを使って処理できるのではと思います。
元データはどのシートにあるのでしょうか?

【12427】Re:入力規則
質問  まぬた@初心者  - 04/4/2(金) 21:29 -

引用なし
パスワード
   ▼Asaki さん:
>こんばんは。
>
>多分、シートのChangeイベントを使って処理できるのではと思います。
>元データはどのシートにあるのでしょうか?

こんばんは。返信を頂いただけでこんなにウキウキする
のは久しぶりです!有難うございます。

元のデータ、というよりは同じブック内のシートのどの
列でも入力規則で制限されたリストの内容が変更された
場合はその変更された内容のタイトルのシートに移動
になる、という事です。
(StatusリストとしてOpen、Closed、Pending Approval
など3つ存在すると同様にそれぞれ同じ様にシートがある、
というイメージです。Openのシートにあった、「Open」
というStatusが「Closed」に変更された場合にその行は
Closedのシートに自動的に移動される、という形にしたい
のです。)

【12433】Re:入力規則
回答  Asaki  - 04/4/3(土) 12:34 -

引用なし
パスワード
   入力規則が設定されているセル位置は、何処になるのでしょうか?
(例:A列で2行目以降 など)

個人的には、リスト内容を変更した瞬間に別のシートにデータが移動する、という仕様はちょっと。。。
マウスが滑って、選択ミスすることがありえますので。
各シートにボタンでもおいて、それを押したタイミングでデータを移動させるのでは?

【12458】Re:入力規則
質問  まぬた@初心者  - 04/4/5(月) 10:04 -

引用なし
パスワード
   まぬたです。
レスポンスが遅れてしまいましてすみません。

作っているものはプロジェクトのToDoリストなのですが、
「ID No」、「タイトル」、「Issue/Risk」、「カテゴリ」、
「起案者」、「起票日」の次の「「ステータス」」を入力
規則でリストを設定(ドロップダウン式)しておりますので、
大体G列あたりになります。

そして分割をする為(列が増えていく)ステータスが変えた
行を移動させたいのは大体7行目以降になります。

もう一度具体的に説明しますと、
リストの値は「Open、On-Going、Closed、PendingApproval」
の4種類でシートも同じ様に4種類ある事になります。
今までは手動でステータスが変わり、変えたものをそのまま
切り取りで移動させて居たのですが、自動にシートを変更
出来る様にしたいのです。
ボタンを置くのが一番賢明な方法でしょうか?


>入力規則が設定されているセル位置は、何処になるのでしょうか?
>(例:A列で2行目以降 など)
>
>個人的には、リスト内容を変更した瞬間に別のシートにデータが移動する、という仕様はちょっと。。。
>マウスが滑って、選択ミスすることがありえますので。
>各シートにボタンでもおいて、それを押したタイミングでデータを移動させるのでは?

【12459】Re:入力規則
回答  Asaki  - 04/4/5(月) 11:32 -

引用なし
パスワード
   とりあえず、↓のような感じで。。。
ThisWorkbook に貼り付けてください。
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

  Dim varRet       As Variant
  Dim rngTarget      As Range
  Dim rngLoop       As Range
  Dim rngDel       As Range

  If ActiveWindow.SelectedSheets.Count <> 1 Then Exit Sub
  If Not IsSheetExist(Sh.Name) Then Exit Sub
On Error Resume Next
  Set rngTarget = Intersect(Target, Sh.Columns("G"))
On Error GoTo 0
  If rngTarget Is Nothing Then Exit Sub

  With Application
    .EnableEvents = False
    .ScreenUpdating = False
  End With
  For Each rngLoop In rngTarget
    If Trim(rngLoop.Value) <> "" Then
      If IsSheetExist(rngLoop.Value) Then
        If Sh.Name <> rngLoop.Value Then
          If rngDel Is Nothing Then
            Set rngDel = rngLoop
          Else
            Set rngDel = Union(rngDel, rngLoop)
          End If
          rngLoop.EntireRow.Copy _
            Destination:=Worksheets(rngLoop.Value).Cells(65536, 1).End(xlUp).Offset(1)
        End If
      End If
    End If
  Next rngLoop
  If Not rngDel Is Nothing Then rngDel.EntireRow.Delete Shift:=xlUp
  With Application
    .EnableEvents = True
    .ScreenUpdating = True
  End With

End Sub

'-- シート存在チェック
Function IsSheetExist(ByVal strVal As String) As Boolean
  Dim varRet     As Variant

  IsSheetExist = False
  varRet = Application.CountIf(Range("ListItem"), strVal)
  If IsError(varRet) Then Exit Function
  If CLng(varRet) = 0 Then Exit Function
  IsSheetExist = True

End Function

前提として、
どのシートもレイアウトが同じ
どのシートも2行目以降にデータ移動
A列は、データがあれば必ず入力されている
ListItemという名前で、入力規則のリストが設定されている

>ボタンを置くのが一番賢明な方法でしょうか?
賢明かどうかは知りませんが、個人的に嫌だというだけです。
先にも書きましたが、手が滑って違うものを選択したときに、そのデータがどこに行ったか判らなくなりそうなので。

【12463】Re:入力規則
お礼  まぬた@初心者  - 04/4/5(月) 12:41 -

引用なし
パスワード
   Wa! 有難うございます!!
早速やってみます。

本当にご親切に有難うございます。。。

【12500】Re:入力規則
質問  まぬた@初心者  - 04/4/6(火) 13:55 -

引用なし
パスワード
   まぬた@初心者です。
先日は有難うございました。

これを機に真面目にVBAを学んでいきたいと思っています。
お薦めの指南書があればお教え下さい。 m(_ _"m)ペコリ
宜しくお願いします。

【12505】Re:入力規則
発言  Asaki  - 04/4/6(火) 14:26 -

引用なし
パスワード
   >先日は有難うございました。
いえいえ。
ご丁寧にどうもです。m(_ _)m

>お薦めの指南書があればお教え下さい。 m(_ _"m)ペコリ
私は本で勉強したわけではないので、どれが良いかはよくわかりません。
また、人が良いと言っても、自分との相性もありますので、やはり、
本屋でぱらぱらページをめくってみて、決められるのが良いと思いますよ。
最近は、大量に出てますから、選ぶのも大変ですが。

あとは、マクロの記録でコードをとってみて、いじくって遊ぶとか、
あちこちのサイトにTips集や解説もありますから、どこかお気に入りのサイトを見つけて
それで勉強されるのも良いかと。

判らなければ、掲示板もたくさんありますから、質問されるもの良いとおもいますよ。
あと、掲示板に上がっている、他の人の質問を読むとか、答えるとか。

頑張ってくださいね。

【12507】Re:入力規則
質問  まぬた@初心者 E-MAIL  - 04/4/6(火) 15:57 -

引用なし
パスワード
   まぬたです。

>頑張ってくださいね。

励ましのお言葉有難うございます!(TへT)

VBAに限らず、参考書を探すのは大変ですよね。。。
今日はじっくり読んでさがしてみたいと思います。

ところで、
教えて頂いたコードですが、最初にワークシート
を変更した場合、となってるみたいで(イベントが)
実行出来ませんでした。。。

ドロップダウンリストのリスト値を動かした場合に
シートを動かす様にするにはどう変更すればよいですか。
全く検討違いの質問だったらすみません、、
が、うまく実行されません。o(-_-;*)

【12508】入力規則(便乗質問)
質問  SHOW  - 04/4/6(火) 15:58 -

引用なし
パスワード
   すいません、便乗質問申し訳ないのですが(しかも、全く内容が違います。

普通にデータ(D)で入力規則の設定が出来ますよね?
現在、自分は小数点第2位までの入力が出来るような入力規則を
設定したいのですが、何かよい方法ありますかね?
それとともに、1000未満999以上という規則も設定したいのです

で、設定方法がいまいちでしたので、マクロでシート全体に小数点2位以下の
入力があったらとりあえずメッセージを出すようなものを組んでみようと
思ったのですが、うまくいきませんでした。
どなたか良い方法知っていたら、ご教授ください。

稚拙ですが、こんなマクロにしてみました。
値を確定する時に、アクティブなセルを変更されてしまうというのが盲点でした。
で、入力の際、必ず一定の方向に入力するわけでもないので・・・

Private Sub Worksheet_Change(ByVal Target As Range)
X = ActiveCell.Value   'ココが、以前のセルならばよいのですが・・・
If X - Int(X * 10) / 10 > 0 Then
MsgBox ("数量確認")
End If
End Sub

【12509】Re:入力規則(便乗質問)
発言  Asaki  - 04/4/6(火) 16:05 -

引用なし
パスワード
   ▼SHOW さん:
>すいません、便乗質問申し訳ないのですが(しかも、全く内容が違います。
内容が全然違うのでしたら、別スレ挙げていただけないでしょうか?

【12511】Re:入力規則
回答  Asaki  - 04/4/6(火) 16:11 -

引用なし
パスワード
   >教えて頂いたコードですが、最初にワークシート
>を変更した場合、となってるみたいで(イベントが)
>実行出来ませんでした。。。
イベント自体は、シートの内容が変わったときに起動するはずなのですが。。。
途中、エラーが発生したりして、
Application.EnableEvents が False のままになっているのかもしれません。

>ドロップダウンリストのリスト値を動かした場合に
>シートを動かす様にするにはどう変更すればよいですか。
シートを動かす、というのは、別のシートを表示する、ということでしょうか?

【12518】Re:入力規則
質問  まぬた@初心者 E-MAIL  - 04/4/6(火) 17:33 -

引用なし
パスワード
   まぬた@初心者です。
度々すみません。

>イベント自体は、シートの内容が変わったときに起動するはずなのですが。。。
>途中、エラーが発生したりして、
>Application.EnableEvents が False のままになっているのかもしれません。

エラーはどうも発生していないみたいでした。

>>ドロップダウンリストのリスト値を動かした場合に
>>シートを動かす様にするにはどう変更すればよいですか。
>シートを動かす、というのは、別のシートを表示する、
>ということでしょうか?

うーむ、私の説明が足らない&わかりにくいのだと思います。
すみません。サンプルのエクセルを添付したいくらいです。_(^^;)ゞ

4枚シートがあって、各シートの名前がStatus(G列)の入力規則
の4つのリスト項目である、Open、On-going、Closed、PendingApproval
となっていて、各行にはそれぞれID No(A列)を割り振られたTO DO項目
があります。B-タイトル、C-種類、D-カテゴリ、E-起票者、F-起票日、
G-Status、H-説明、I-影響、J-必要とされるアクション、K-担当者、
L-期日、M-対応ステータス、N-解決日と記入するセルがあります。
シートと同じ名前のStatusを持つTO DO項目しかシート内には最初は
存在しません。例えば現在、ID番号が1〜5まであるとして、それぞれ
のStatusが 1-Open、2-PendingApproval、3-Closed、4-Open、5-Open
となると、1と4と5が一枚目のシート(Open)にあり、2,3はそれぞれの
Statusと同じ名前のシートに最初は位置されるとします。そのToDO項目
も状況が変化し、解決されるとOpenからClosedになり、Stausを変えます。
そのStatusが変更された際に列が丸ごとOpenのシートからClosedのシート
に移動するという事になります。最終的(プロジェクト終了後)にOpenは
ID番号がふられたTODO項目はなくなり、レイアウトだけで空になる様に
なります。尚、入力規則のリストが存在するのはG列(Staus)のみです。

長くなっただけでうまく説明できたとは思いませんが...
宜しくお願いします。m(。_。;))m

【12519】Re:入力規則
回答  Asaki  - 04/4/6(火) 17:37 -

引用なし
パスワード
   こちらでテストする限りでは、ご説明の動きのつもりですが?
とりあえず、イベントが発生しているかどうか、チェックしてみてください。
また、シート名と入力規則のリストの内容が一致していると思っています。
そうでない場合は、動かないと思います。

【12521】Re:入力規則
発言  まぬた@初心者 E-MAIL  - 04/4/6(火) 18:27 -

引用なし
パスワード
   >シート名と入力規則のリストの内容が一致していると思っています。
>そうでない場合は、動かないと思います。

(*゚0゚)ハッ!! 入力規則のリスト内容ではPendingApprovalが
シート名でPending Approval、とスペースが入ってました...
お騒がせしました。すみません...

【12524】Re:入力規則
質問  まぬた@初心者 E-MAIL  - 04/4/6(火) 20:06 -

引用なし
パスワード
   まぬた@初心者です。

>>シート名と入力規則のリストの内容が一致していると思っています。
>>そうでない場合は、動かないと思います。
>
>(*゚0゚)ハッ!! 入力規則のリスト内容ではPendingApprovalが
>シート名でPending Approval、とスペースが入ってました...
>お騒がせしました。すみません...

・・・Σ( ̄⊥ ̄lll)・・・
やはり動きません...
何がおかしいのでしょう。。。

Asakiさんの様にすらすらできる様になる日が来るのでしょうか。。。
心配になってきました..

【12528】Re:入力規則
回答  Asaki  - 04/4/6(火) 22:30 -

引用なし
パスワード
   あの〜、根本的な質問なんですが、1度でも、動いたことありますか?
プログラムは、ThisWorkbook に貼り付けられましたか?

【12538】Re:入力規則
質問  まぬた@初心者  - 04/4/7(水) 9:56 -

引用なし
パスワード
   要領の悪い質問でごめんなさい。。。
一応、ThisWorkbookに貼り付けれてます。
一度稼動しましたが、オブジェクトエラーの修正をしたら
動かなくなってしまったのです。

【12539】Re:入力規則
回答  Asaki  - 04/4/7(水) 10:00 -

引用なし
パスワード
   どこをどう変えられましたか?
現在のコードをup出来ませんか?

【12544】Re:入力規則
質問  まぬた@初心者  - 04/4/7(水) 11:26 -

引用なし
パスワード
   ほとんど変えてません。
エクセル表内容の方に間違いがあるかも
しれないのでチェックします。お手数を
お掛けしておりますm(。_。;))m

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

  Dim varRet       As Variant
  Dim rngTarget      As Range
  Dim rngLoop       As Range
  Dim rngDel       As Range

  If ActiveWindow.SelectedSheets.Count <> 1 Then Exit Sub
  If Not IsSheetExist(Sh.Name) Then Exit Sub
On Error Resume Next
  Set rngTarget = Intersect(Target, Sh.Columns("H"))
On Error GoTo 0
  If rngTarget Is Nothing Then Exit Sub

  With Application
    .EnableEvents = False
    .ScreenUpdating = False
  End With
  For Each rngLoop In rngTarget
    If Trim(rngLoop.Value) <> "" Then
      If IsSheetExist(rngLoop.Value) Then
        If Sh.Name <> rngLoop.Value Then
          If rngDel Is Nothing Then
            Set rngDel = rngLoop
          Else
            Set rngDel = Union(rngDel, rngLoop)
          End If
          rngLoop.EntireRow.Copy _
            Destination:=Worksheets(rngLoop.Value).Cells(65536, 1).End(xlUp).Offset(1)
        End If
      End If
    End If
  Next rngLoop
  If Not rngDel Is Nothing Then rngDel.EntireRow.Delete Shift:=xlUp
  With Application
    .EnableEvents = True
    .ScreenUpdating = True
  End With

End Sub

'-- シート存在チェック
Function IsSheetExist(ByVal strVal As String) As Boolean
  Dim varRet     As Variant

  IsSheetExist = False
  varRet = Application.CountIf(Range("List_Item"), strVal)
  If IsError(varRet) Then Exit Function
  If CLng(varRet) = 0 Then Exit Function
  IsSheetExist = True

End Function

【12546】Re:入力規則
回答  Asaki  - 04/4/7(水) 11:37 -

引用なし
パスワード
   入力規則って、G列に設定されているのではないのですか?
H列になってますが。。。
>Set rngTarget = Intersect(Target, Sh.Columns("H"))

【12553】Re:入力規則
質問  まぬた@初心者  - 04/4/7(水) 13:37 -

引用なし
パスワード
   ▼Asaki さん:
>入力規則って、G列に設定されているのではないのですか?
>H列になってますが。。。
>>Set rngTarget = Intersect(Target, Sh.Columns("H"))

項目が増やされたのでHにしました。

【12554】Re:入力規則
回答  Asaki  - 04/4/7(水) 13:52 -

引用なし
パスワード
   ちょっと原因が良くわかりませんので、ブレークポイントを設定して、
どう動いているのかを確認してみてください。

>If ActiveWindow.SelectedSheets.Count <> 1 Then Exit Sub
の行をクリックして、F9を押してブレークポイントを設定します。
シートに戻って、Statusを変更します。
ブレークポイントで処理が中断したらF8を押して、1行ずつプログラムをステップ実行します。

意図しない処理に入ったりしたら、そこを教えてください。

#レスのネストが深くなったので、戻します。

【12557】Re:入力規則
発言  でれすけ  - 04/4/7(水) 14:38 -

引用なし
パスワード
   こんにちわ

横から失礼します。
お使いになっているExcelのバージョンは何でしょうか。

97だと、入力規則でセルの値を変更したとき、
Changeイベントが走らなかったような気がしますが...

【12560】普通の入力規則ですが..。
回答  Jaka  - 04/4/7(水) 15:54 -

引用なし
パスワード
   こんにちは

▼でれすけ さん:
>97だと、入力規則でセルの値を変更したとき、
>Changeイベントが走らなかったような気がしますが...
入力規則のリストを使った場合は、走りません。
97だったら、Calculateイベントを応用するしかないと思います。

普通の入力規制だと、こんな感じでしょうか?
E8セルの場合です。

=AND(E8<1000,E8>=999,LEN(TEXT(E8,"@"))-FIND(".",TEXT(E8,"@"),1)=2)

【12561】Re:普通の入力規則ですが..。
発言  でれすけ  - 04/4/7(水) 17:12 -

引用なし
パスワード
   こんにちわ

▼Jaka さん:
>普通の入力規制だと、こんな感じでしょうか?
>E8セルの場合です。
>
>=AND(E8<1000,E8>=999,LEN(TEXT(E8,"@"))-FIND(".",TEXT(E8,"@"),1)=2)
こちらの方の質問は、別スレッドがたって既に解決されているようですよ。

【12562】Re:普通の入力規則ですが..。
発言  Jaka  - 04/4/7(水) 17:15 -

引用なし
パスワード
   ▼でれすけ さん:
>>=AND(E8<1000,E8>=999,LEN(TEXT(E8,"@"))-FIND(".",TEXT(E8,"@"),1)=2)
>こちらの方の質問は、別スレッドがたって既に解決されているようですよ。

えっ、そうなんですか..。
ご連絡、ありがとうございました。

【12563】Re:普通の入力規則ですが..。
発言  Asaki  - 04/4/7(水) 17:23 -

引用なし
パスワード
   皆様、こんにちは。

>>>=AND(E8<1000,E8>=999,LEN(TEXT(E8,"@"))-FIND(".",TEXT(E8,"@"),1)=2)
>>こちらの方の質問は、別スレッドがたって既に解決されているようですよ。
↓これですね。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=12510;id=excel

実は、私の腕では要件にかなう入力規則の式が立てられませんでして。。。
勉強になります。m(_ _)m

【12569】入力規則
お礼  まぬた@初心者  - 04/4/7(水) 18:24 -

引用なし
パスワード
   皆さん!!!!
どうも有難うございました!
解決しました。
見事に動きました。

単純なミスでした...


本当に本当に、、、有難うございました!!!!!
(ちなみにVersionは2002です)

【12570】Re:入力規則
お礼  まぬた@初心者  - 04/4/7(水) 19:13 -

引用なし
パスワード
   >皆さん!!!!
>どうも有難うございました!
>解決しました。
>見事に動きました。
>
>単純なミスでした...
>
>
>本当に本当に、、、有難うございました!!!!!
>(ちなみにVersionは2002です)

とっても嬉しいです!

12071 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free