Excel VBA質問箱 IV

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

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


6218 / 13644 ツリー ←次へ | 前へ→

【46366】Arreyを増やすには にしもり 07/1/31(水) 22:50 質問[未読]
【46389】Re:Arreyを増やすには neptune 07/2/1(木) 16:14 発言[未読]
【46391】Re:Arreyを増やすには にしもり 07/2/1(木) 17:39 発言[未読]
【46394】Re:Arreyを増やすには neptune 07/2/1(木) 18:15 発言[未読]
【46485】Re:Arreyを増やすには にしもり 07/2/5(月) 13:44 発言[未読]
【46535】Re:Arreyを増やすには neptune 07/2/6(火) 9:01 発言[未読]
【46536】Re:Arreyを増やすには にしもり 07/2/6(火) 9:26 発言[未読]
【46551】Re:Arreyを増やすには neptune 07/2/6(火) 16:24 発言[未読]
【46553】Re:Arreyを増やすには にしもり 07/2/6(火) 16:52 発言[未読]

【46366】Arreyを増やすには
質問  にしもり  - 07/1/31(水) 22:50 -

引用なし
パスワード
     【39744】の関連です。

以前教えていただいたarreyが13個から19個に増えることとなりました。
arreyにMM1 - MM6を追加しました。
また、Loopの制限を > 13から > 19に変えました。
ですが、Mod演算子のところをどう変えればいいかわかりません。どなたかおしえてください。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Stm As String, Etm As String
  Dim St As String, Unm As String, ComS As String
  Dim Sc As Integer, Ec As Integer
  Dim Rc As Long, i As Integer, Col As Integer
  Dim Flg As Boolean
  Dim MyR As Range, C As Range
  Dim NmAry As Variant, ClAry As Variant, Num As Variant

  If Intersect(Target, Range("E6:E65536").SpecialCells(-4174)) _
  Is Nothing Then Exit Sub
  With Target
   If .Count > 1 Then Exit Sub
   If IsEmpty(.Offset(, -1).Value) Then Exit Sub
   Rc = .Row
   If Not .Validation.Value Then
     Flg = True: GoTo ELine
   End If
   If .Offset(, -1).Value > .Value Then
     Flg = True: GoTo ELine
   End If
   Range("D6:E65536").SpecialCells(-4174).NumberFormat = "h:mm"
   Stm = .Offset(, -1).Text
   Etm = .Text
  End With
  For Each C In Range("F4:AP4")
   If C.Text = Stm Then Sc = C.Column
   If C.Text = Etm Then Ec = C.Column: Exit For
  Next
  If Sc = 0 Or Ec = 0 Then
   Flg = True: GoTo ELine
  End If

  Set MyR = Range(Cells(Rc, Sc), Cells(Rc, Ec))
  If Not MyR.Count = 0 Then
   If WorksheetFunction.CountA(MyR) >= 1 Then
     MsgBox "その時間帯は入力済みです", 48
     GoTo ELine2
   End If
  Else
   If IsEmpty(MyR.Value) Then
     GoTo ELine
   End If
  End If
 
ELine:
  Application.EnableEvents = False
  If Flg Then
   MsgBox "入力した値は条件に一致しません。" & _
   "クリアして終了します", 48
  Else
'↓MM1 - MM6を追加しました
  NmAry = Array("AA", "BB", "CC", "DD", "EE", _
  "FF", "GG", "HH", "II", "JJ", "KK", "LL", "MM","MM1","MM2","MM3","MM4","MM5","MM6")
  ClAry = Array(46, 47, 48, 49, 50, 51, 52, 53, 54, 3, 5, 6, 8,8,8,8,8,8,8)
  St = "[氏名の番号を下記の対応表に従って入力して下さい]" & _
  vbLf & "AA = 1 : "
'↓Mod演算子のところをどう変えればいいかわかりません。おしえてください。
  For i = 1 To UBound(NmAry)
  If i Mod 3 = 0 Then
    St = St & NmAry(i - 2) & " = " & i - 1 & _
    " : " & NmAry(i - 1) & " = " & i & _
    " : " & NmAry(i) & " = " & i + 1 & vbLf
  End If
  Next i
  
  St = Left$(St, Len(St) - 1)
  Do
    Num = Application.InputBox(St, Type:=1)
    If VarType(Num) = 11 Then GoTo ELine2

'↓> 13を > 19に変えました
  Loop While CInt(Num) < 1 Or CInt(Num) > 19
  Unm = NmAry(CInt(Num) - 1): Col = ClAry(CInt(Num) - 1)

   MyR.Value = Unm
   MyR.Interior.ColorIndex = Col
   ComS = InputBox("コメントを付加したい場合は情報を入力して下さい")
   If ComS <> "" Then
     Cells(Rc, Sc).AddComment ComS
     Cells(Rc, Sc).Comment.Visible = False
   End If
  End If
ELine2:
  Cells(Rc, 4).Resize(, 2).ClearContents
  Application.EnableEvents = True
  Set MyR = Nothing
End Sub



【46389】Re:Arreyを増やすには
発言  neptune  - 07/2/1(木) 16:14 -

引用なし
パスワード
   ▼にしもり さん:
こんにちは
Resが付かないようなので・・・

>以前教えていただいたarreyが13個から19個に増えることとなりました。
>arreyにMM1 - MM6を追加しました。
>また、Loopの制限を > 13から > 19に変えました。
>ですが、Mod演算子のところをどう変えればいいかわかりません。どなたかおしえてください。

文字列操作というのはわかりますが、具体的に何のデータを何の為に
というのが判らないのでわかりません。
長いので解読する気も起こりません。

何の処理をしているかを理解すれば改造もおのずから出来ると思いますが?
何をどうやっているか理解してますか?

 For i = 1 To UBound(NmAry)
  If i Mod 3 = 0 Then
    St = St & NmAry(i - 2) & " = " & i - 1 & _
    " : " & NmAry(i - 1) & " = " & i & _
    " : " & NmAry(i) & " = " & i + 1 & vbLf
  End If
 Next i

【46391】Re:Arreyを増やすには
発言  にしもり  - 07/2/1(木) 17:39 -

引用なし
パスワード
   ▼neptune さん:

ご迷惑をおかけしています。
元は 【38613】 です。

これば出退勤表です。
D6は開始時間・E6は終了時間です。F6以降の各列には、D6:E6に規定時間内の勤務時間を入力した場合だけ、連続して氏名を入力していきます。
その際にフォームを使っています。

もうすこし具体的にいいますと、AAなら1、BBなら2・・フォームにと入れます。
そして1の場合はAAが,また、2の場合はBBが、スプレッドシート上に色とともに表示されるのです。

その名前の選択肢が今回、13個から19個に増えたのです。
そもそもわたしが皆様におんぶにだっこだからいけないとおもいます。
Mod演算子を十分理解していないからいけないのだと思います。
もう少し自力で進めてみます。

【46394】Re:Arreyを増やすには
発言  neptune  - 07/2/1(木) 18:15 -

引用なし
パスワード
   ▼にしもり さん:
こんにちは

>これば出退勤表です。
>D6は開始時間・E6は終了時間です。F6以降の各列には、D6:E6に規定時間内の勤務時間を入力した場合だけ、連続して氏名を入力していきます。
>その際にフォームを使っています。
>
>もうすこし具体的にいいますと、AAなら1、BBなら2・・フォームにと入れます。
>そして1の場合はAAが,また、2の場合はBBが、スプレッドシート上に色とともに表示されるのです。

AA,BBというのは氏名ですか?
正直に言いますと、インターフェイスがまずいと思います。
ちょっと問題のところだけ実行してみたのですが
////////////////////////////////////////////////////
[氏名の番号を下記の対応表に従って入力して下さい]
AA = 1 : BB = 2 : CC = 3 : DD = 4
EE = 5 : FF = 6 : GG = 7
HH = 8 : II = 9 : JJ = 10
KK = 11 : LL = 12 : MM = 13
MM1 = 14 : MM2 = 15 : MM3 = 16
MM4 = 17 : MM5 = 18 : MM6 = 19
///////////////////////////////////////////////////////
のように出てきます。私なら長いので読んで、Keyを打たなければなりません。
わずかなことですが、結構、億劫です。
こういう場合は、コンボボックスか、ListとTextBoxを組み合わせて
Mouseを使った方がユーザーに親切と思います。

新規Bookで、UserFormにComboBoxを1個貼り付けて以下を実行して
テストしてみて下さい。簡単です。
こんなこと百も承知ならごめんなさい。

Private Sub UserForm_Initialize()
Dim NmAry As Variant
Dim I As Long

  NmAry = Array("AA", "BB", "CC", "DD", "EE", _
  "FF", "GG", "HH", "II", "JJ", "KK", "LL", "MM", "MM1", "MM2", "MM3", "MM4", "MM5", "MM6")
  Me.ComboBox1.Style = fmStyleDropDownList
  
  For I = 0 To UBound(NmAry) - 1
    Me.ComboBox1.AddItem NmAry(I)
  Next I
End Sub

【46485】Re:Arreyを増やすには
発言  にしもり  - 07/2/5(月) 13:44 -

引用なし
パスワード
   ▼neptune さん:
こんにちは。
AA,BB・・は名前です。
百も承知などということはございません。初級者です。

開始時間帯と終了時間帯を入れるとUserFormが出るところまではできました。
最後にコンボボックスで選んだ名前を選択して、開始時間帯、終了時間帯、名前がそろいます。

やりたいことは、たとえばD6で9:00、E6で9:15、UserformでAAをそれぞれ選んだら
F6,G6にそれぞれAAが入り、当該セルがアクア色になるようにしたいのです。

なおF4には9:00,G4には9:15・・・・・AP4には18:00とあらかじめ入っています。
また、D6以下の行はプルダウンで開始時間帯を9:00,9:15・・・18:00から、
E6以下の行はプルダウンで終了時間帯を9:00,9:15・・・18:00から選ぶことになっています。

週末に考えましたが、UserFormに変えたことによって、コメント化した個所をどうかえればいいかわかりません。
もしよろしくければアドバイスいただけますと幸いです。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Stm As String, Etm As String
  Dim St As String, Unm As String, ComS As String
  Dim Sc As Integer, Ec As Integer
  Dim Rc As Long, I As Integer, Col As Integer
  Dim Flg As Boolean
  Dim MyR As Range, C As Range
  Dim NmAry As Variant, ClAry As Variant, Num As Variant

  If Intersect(Target, Range("E6:E65536").SpecialCells(-4174)) _
  Is Nothing Then Exit Sub
  With Target
   If .Count > 1 Then Exit Sub
   If IsEmpty(.Offset(, -1).Value) Then Exit Sub
   Rc = .Row
   If Not .Validation.Value Then
     Flg = True: GoTo ELine
   End If
   If .Offset(, -1).Value > .Value Then
     Flg = True: GoTo ELine
   End If
   Range("D6:E65536").SpecialCells(-4174).NumberFormat = "h:mm"
   Stm = .Offset(, -1).Text
   Etm = .Text
  End With
  For Each C In Range("F4:AP4")
   If C.Text = Stm Then Sc = C.Column
   If C.Text = Etm Then Ec = C.Column: Exit For
  Next
  If Sc = 0 Or Ec = 0 Then
   Flg = True: GoTo ELine
  End If

  Set MyR = Range(Cells(Rc, Sc), Cells(Rc, Ec))
  If Not MyR.Count = 0 Then
   If WorksheetFunction.CountA(MyR) >= 1 Then
     MsgBox "その時間帯は入力済みです", 48
     GoTo ELine2
   End If
  Else
   If IsEmpty(MyR.Value) Then
     GoTo ELine
   End If
  End If

ELine:
  Application.EnableEvents = False
  If Flg Then
   MsgBox "入力した値は条件に一致しません。" & _
   "クリアして終了します", 48
  Else
 
    UserForm1.Show
  NmAry = Array("AA", "BB", "CC", "DD", "EE", _
  "FF", "GG", "HH", "II", "JJ", "KK", "LL", "MM", "MM1", "MM2", "MM3", "MM4", "MM5", "MM6")
  Me.ComboBox1.Style = fmStyleDropDownList

  For I = 0 To UBound(NmAry) - 1
    Me.ComboBox1.AddItem NmAry(I)
  Next I
  

  ClAry = Array(42, 50, 39, 40, 46, 46, 46, 46, 46, 46, 36, 35, 3, 38, 4, 43, 6, 41, 8)
 
'↓UserFormに変えたことで、ここをどうかえればいいかわかりません。

'  St = "[ユニットの番号を下表に従って入力して下さい]" & _
'  vbLf & "AA = 1 : "
'  For I = 1 To UBound(NmAry)
'  If I Mod 3 = 0 Then
'    St = St & NmAry(I - 2) & " = " & I - 1 & _
'    " : " & NmAry(I - 1) & " = " & I & _
'    " : " & NmAry(I) & " = " & I + 1 & vbLf
'  End If
'  Next I
'
'  St = Left$(St, Len(St) - 1)
'  Do
'    Num = Application.InputBox(St, Type:=1)
'    If VarType(Num) = 11 Then GoTo ELine2
'  Loop While CInt(Num) < 1 Or CInt(Num) > 19
'  Unm = NmAry(CInt(Num) - 1): Col = ClAry(CInt(Num) - 1)

'  MyR.Value = Unm

   MyR.Value = Me.ComboBox1.AddItem NmAry(I)
   MyR.Interior.ColorIndex = Col
   ComS = InputBox("コメントを入力できます。")
   If ComS <> "" Then
     Cells(Rc, Sc).AddComment ComS
     Cells(Rc, Sc).Comment.Visible = False
   End If
  End If
ELine2:
  Cells(Rc, 4).Resize(, 2).ClearContents
  Application.EnableEvents = True
  Set MyR = Nothing
End Sub

【46535】Re:Arreyを増やすには
発言  neptune  - 07/2/6(火) 9:01 -

引用なし
パスワード
   ▼にしもり さん:
こんにちは
>'↓UserFormに変えたことで、ここをどうかえればいいかわかりません。
>
>'  St = "[ユニットの番号を下表に従って入力して下さい]" & _
>'  vbLf & "AA = 1 : "
>'  For I = 1 To UBound(NmAry)
>'  If I Mod 3 = 0 Then
>'    St = St & NmAry(I - 2) & " = " & I - 1 & _
>'    " : " & NmAry(I - 1) & " = " & I & _
>'    " : " & NmAry(I) & " = " & I + 1 & vbLf
>'  End If
>'  Next I
>'
>'  St = Left$(St, Len(St) - 1)
>'  Do
>'    Num = Application.InputBox(St, Type:=1)
>'    If VarType(Num) = 11 Then GoTo ELine2
>'  Loop While CInt(Num) < 1 Or CInt(Num) > 19
例えば、このあたりは、UserFormを利用するなら、ListBoxに選択肢を
列挙しておいて、それを選択させるのも良いかと思います。

>'  Unm = NmAry(CInt(Num) - 1): Col = ClAry(CInt(Num) - 1)
>
>'  MyR.Value = Unm
>
>   MyR.Value = Me.ComboBox1.AddItem NmAry(I)
>   MyR.Interior.ColorIndex = Col
>   ComS = InputBox("コメントを入力できます。")
>   If ComS <> "" Then
>     Cells(Rc, Sc).AddComment ComS
>     Cells(Rc, Sc).Comment.Visible = False
>   End If
>  End If
これも同様です。

後、気づいた点ですが、
Cells(Rc, Sc).AddComment ComS

worksheets("sheetname").Cells(Rc, Sc).AddComment ComS
のように親オブジェクトを明示した方がバグが少ないプログラムが書けます。

 例としてUserFormにコンボボックスの例を紹介しましたが、
データ数が少なければ、入力規則を利用してもいいのではないでしょうか?
要は、Userにやさしいインターフェイスをと理解していただきたい。

私なら、入力する全ての項目をUserForm内に配置して、出来るだけ
マウスで処理できるようにして、誤入力をさせないように考えます。

//////////////////////////////////////////////////////////////
ここから先は、決して意地悪で書いているわけではありませんので
誤解のないように願います

仕様の一部を書かれていますが、私にはそれを理解し、テストデータを作成し、
ロジックを考えプログラムを書く気はありませんのでお断りしておきます。

技術上、手法などの質問にはわかる範囲でお答えしますし、気が向けば
サンプルも書きますが、余りにもカスタムなものは基本的にはプログラム
は書きません。
 こういうことをすると困るのは質問者です、現に書いてもらったロジック
が判らなくて困っておられるでしょう?コード化はともかく、最低限
ロジックはご自分で考えるべきです。プログラムで一番大事なのは
そのロジックですから。

現に作ってもらって今、改造に困っているでしょう???

ベストなロジックかどうかは考えないでもいいです。
最初は自分で考えたロジックを使うのが一番です。スキルが上がるに連れ
効率の良いロジックを考えるようになりますが、先ず、希望通りに動作する
のが第一です。

【46536】Re:Arreyを増やすには
発言  にしもり  - 07/2/6(火) 9:26 -

引用なし
パスワード
   ▼neptune さん:

大変ご迷惑をおかけしています。

>ロジックはご自分で考えるべきです。プログラムで一番大事なのは
>そのロジックですから。

カスタムなものをつくってもらおうという意図はもとより無いのですが
おんぶにだっこ状態になってしまいました。
大事なのは自分でロジックを考えることとのご指摘、もっともでございます。
やりたいことはわかっているのですが頭の中で規則性をロジックにできません。
なんとか自分の力でやってみたいとおもいます。

どうもありがとうございました

【46551】Re:Arreyを増やすには
発言  neptune  - 07/2/6(火) 16:24 -

引用なし
パスワード
   ▼にしもり さん:
こんにちは。もう見ないかな??

>大変ご迷惑をおかけしています。
それなりにやっておりますから、気にしないで下さい。

>カスタムなものをつくってもらおうという意図はもとより無いのですが
>おんぶにだっこ状態になってしまいました。
はい。それが判っているからResを続けました。
私は完全な作って君には書き込みませんので。


>やりたいことはわかっているのですが頭の中で規則性をロジックにできません。
>なんとか自分の力でやってみたいとおもいます。
頑張ってくださいませ。^ ^

私はこんがらかった時は、自分の頭でそのような処理をしているかを
紙に書いて整理します。そうすると案外判りやすくなりまとまります。

是非、頭の中だけでなく、紙にも書いてやってみてください。

【46553】Re:Arreyを増やすには
発言  にしもり  - 07/2/6(火) 16:52 -

引用なし
パスワード
   ▼neptune さん:
レスありがとうございます。

>是非、頭の中だけでなく、紙にも書いてやってみてください。
至極当たり前のことをしておりませんでした。
紙にフローを書いて整理してみます。

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