Excel VBA質問箱 IV

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

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


106 / 3841 ページ ←次へ | 前へ→

【80362】Re:カレンダーに予定を自動入力したい
お礼  VBA初心者  - 19/2/1(金) 10:05 -

引用なし
パスワード
   ▼マナ さん:
>▼VBA初心者 さん:
>
>1)カレンダーなのに、日付検索で複数ヒットする可能性がありますか。
>Do〜Loopは必要ないのでは?
>ということです。
>
>2)シリアル値に変換する必要ありますか。
>というか、検索できますか?
>
>3)文法が間違っている
>>Range(myObj).Offset(1, 0).Activate
>>Q = Range(myObj).Offset(1, 0).Activate
>>Set Q = Worksheets("Sheet1").Cells(Z, 2).Value
>
>4)変数名がわかりにくいです(人のこと言えませんが…)
>
> 

マナ様

お返事ありがとうございます。

上記内容に関して返答させていただきます。

1)カレンダーなのに、日付検索で複数ヒットする可能性がありますか。
Do〜Loopは必要ないのでは?ということです。

→エクセルのカレンダーのテンプレート(1月〜12月でsheetが分けられて表示されるもの)を使っています。sheetは行に5週分の日数、列に日曜〜土曜の曜日が入力されています。その中で、2019年1月のsheetは31日が木曜日なので、残りの金曜日と土曜日の枠には2月1,2日が入力されています。その中で全部のsheetを参照すると重複する箇所が出てくるのでDo〜Loopを使用してみました。


2)シリアル値に変換する必要ありますか。というか、検索できますか?

→自分が入力した日付をそのままカレンダーで検索することが出来なかった(私が無知だということが原因です・・・。)のでシリアル値なら検索できるかなと考え、一度日付を変更して検索するという手段をとりました。
検索は出来ていると思います。


3)文法の指摘、ありがとうございます。


4)大変申し訳ありません。自分だけが今何をやっているのか理解できるようにつけていたので、混乱させてしまいました。
・ツリー全体表示

【80361】Re:カレンダーに予定を自動入力したい
お礼  VBA初心者  - 19/2/1(金) 9:33 -

引用なし
パスワード
   ▼γ さん:
>コードだけではなく、
>・現在のシートのレイアウト(行番号、列番号がわかるもの)と
>・どういうことを実行したいのかを
>説明するのが先でしょう。
>
>あなたの頭にあることを、
>間違っているコードで想像するのは大変です。

γ様

お返事ありがとうございます。
無知で大変申し訳ありません。

現在のシートレイアウトは、

・A列に自分が入力した日付
・B列に自分が入力した文字列
・E1〜K10までにエクセルのテンプレートにあるカレンダー(1月分)を引用したもの(日付の下に空白セルがありメモが取れるようになっています)


私がやりたいことは、

B列に入力した文字列をA列に入力した日付と同じ日付のカレンダーのメモ欄に自動で入力してほしいということです。

また現在は1月分だけですが、最終的にはシートを分けて1月〜12月までのカレンダーに自動入力できるようにしたいです。


宜しくお願い致します。
・ツリー全体表示

【80360】Re:カレンダーに予定を自動入力したい
発言  マナ  - 19/1/31(木) 22:47 -

引用なし
パスワード
   ▼VBA初心者 さん:

こんな感じのことでしょうか

Option Explicit

Sub カレンダー入力()
  Dim rngカレンダー As Range
  Dim rng予定表 As Range
  Dim c As Range
  Dim rng検索 As Range
  Dim 業務 As String
  
  Set rngカレンダー = Worksheets("Sheet2").Range("E1:K10")
  Set rng予定表 = Worksheets("Sheet1").Range("A1").CurrentRegion
  
  For Each c In rng予定表.Columns(1).Cells

    Set rng検索 = rngカレンダー.Find(c.Value, LookAt:=xlWhole)
    
    If Not rng検索 Is Nothing Then
      With rng検索.Offset(1, 0)
        業務 = WorksheetFunction.Trim(c.Offset(0, 1).Value & " " & .Value)
        .Value = Join(Split(業務), vbLf)
      End With
    End If
    
  Next c
  
End Sub


 
・ツリー全体表示

【80359】Re:EXCELのユーザーフォームにあるリスト...
お礼  くるみ  - 19/1/31(木) 21:53 -

引用なし
パスワード
   私の認識不足ですね。
基本そのような対応が必要になっているとは思いませんでした。

不快な思いをさせてすみません。


誤解がないよう申し上げておきますが、解決次第他サイトでも報告するつもりでした。
そのことはご理解いただければと存じます。
・ツリー全体表示

【80358】Re:EXCELのユーザーフォームにあるリスト...
発言  マナ  - 19/1/31(木) 21:09 -

引用なし
パスワード
   ▼くるみ さん:

エクセルの学校もマルチポストに関しては同じような方針ですが
個人的には、どちらかに絞ったほうがよいと思います。

本サイトの基本方針
ht tp://www.vbalab.net/bbspolicy.html

別のサイト(掲示板)にまったく同じ目的の投稿をすることを、一般に「マルチポスト」といいます。当質問箱では、マルチポストは原則認めています。つまり、ほかのサイトで質問したことをこのサイトで質問してもかまわないということです。

しかし、もしマルチポストをするのなら、可能な限り「○○にも同じ質問を出しました」ということを宣言してください。そして、仮に他のサイトで解決したのなら、ここにも必ずその顛末を書いてください。質問しっぱなし、というのはモラルに反します。「解決したからいいや」というのではありません。

また、マルチポストを明示的に禁止しているサイトとのマルチポストをしてはいけません。
・ツリー全体表示

【80357】Re:カレンダーに予定を自動入力したい
発言  マナ  - 19/1/31(木) 20:59 -

引用なし
パスワード
   ▼VBA初心者 さん:

1)カレンダーなのに、日付検索で複数ヒットする可能性がありますか。
Do〜Loopは必要ないのでは?
ということです。

2)シリアル値に変換する必要ありますか。
というか、検索できますか?

3)文法が間違っている
>Range(myObj).Offset(1, 0).Activate
>Q = Range(myObj).Offset(1, 0).Activate
>Set Q = Worksheets("Sheet1").Cells(Z, 2).Value

4)変数名がわかりにくいです(人のこと言えませんが…)

 
・ツリー全体表示

【80356】Re:カレンダーに予定を自動入力したい
発言  γ  - 19/1/31(木) 20:34 -

引用なし
パスワード
   コードだけではなく、
・現在のシートのレイアウト(行番号、列番号がわかるもの)と
・どういうことを実行したいのかを
説明するのが先でしょう。

あなたの頭にあることを、
間違っているコードで想像するのは大変です。
・ツリー全体表示

【80355】EXCELのユーザーフォームにあるリストボ...
質問  くるみ  - 19/1/31(木) 18:29 -

引用なし
パスワード
   ◆◆質問内容

EXCELでユーザーフォームを作り、データベースから条件に当てはまるものをリストボックスで一覧表示させています。
表示させているものは、Worksheetsは顧客情報にある列「顧客名」、「顧客分類」、「状態」の情報です。

Changeを使用しそれぞれに該当するテキストボックスorコンポボックスに入力があると、リストボックスに表示される仕組みなのですが、「顧客分類」にある”販売済"だけを省いて表示するような仕組みができないかと、チェックボックスを作ってやってみたのですができません。

どなたかご教授よろしくお願いいたします。

◆◆全体コード

Option Explicit


Private Sub TextBox1_Change()
  Call SetListBox
End Sub

Private Sub UserForm_Initialize()
  rtnNo = 0
  Call SetBunruiList
  Call SetListBox

End Sub

'ここを追加

Private Sub CheckBox1_Click()

  Dim i As Long
  
  If Me.CheckBox1.Value = True Then
    With Me.lst顧客リスト
      For i = .ListCount To 1 Step -1
        If .Cells(.Range("顧客分類列")) = "販売済" Then
          .RemoveItem (i - 1)
        End If
      Next
    End With
  End If
  
End Sub

'ここまで追加

Private Sub SetBunruiList()
  Dim wRow    As Long
  
  Me.cmb顧客分類.Clear
  For wRow = 3 To Worksheets("顧客分類").Range("A1").CurrentRegion.Rows.Count
    Me.cmb顧客分類.AddItem Worksheets("顧客分類").Cells(wRow, 1)
  Next
End Sub


Private Sub txt顧客名_Change()
  Call SetListBox
End Sub

Private Sub cmb顧客分類_Change()
  Call SetListBox
End Sub

Private Sub lst顧客リスト_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  rtnNo = Me.lst顧客リスト.Text
  Unload Me
End Sub

Private Sub SetListBox()
  Dim wRow    As Long
  Dim wLstRow   As Long
  Dim wHitFlg   As Boolean
  
  Me.lst顧客リスト.Clear
  wLstRow = 0
  With Worksheets("顧客情報")
    For wRow = 2 To .Range("A1").CurrentRegion.Rows.Count
      wHitFlg = True
      If Me.txt顧客名 <> "" Then
        If InStr(1, .Cells(wRow, .Range("顧客名列").Column), Me.txt顧客名, vbTextCompare) = 0 Then
          wHitFlg = False
        End If
      End If
      If Me.cmb顧客分類 <> "" Then
        If .Cells(wRow, .Range("顧客分類列").Column) <> Me.cmb顧客分類 Then
          wHitFlg = False
        End If
      End If
       If Me.TextBox1 <> "" Then
        If InStr(1, .Cells(wRow, .Range("状態列").Column), Me.TextBox1, vbTextCompare) = 0 Then
          wHitFlg = False
        End If
      End If
      If wHitFlg = True Then
        Me.lst顧客リスト.AddItem ""
        Me.lst顧客リスト.List(wLstRow, 0) = wRow
        Me.lst顧客リスト.List(wLstRow, 1) = Worksheets("顧客情報").Cells(wRow, 2)
        Me.lst顧客リスト.List(wLstRow, 2) = Worksheets("顧客情報").Cells(wRow, 3)
        Me.lst顧客リスト.List(wLstRow, 3) = Worksheets("顧客情報").Cells(wRow, 8)

        wLstRow = wLstRow + 1
      End If
    Next
  End With
  
  'ここを追加

  Dim i As Long
  
   If Me.CheckBox1.Value = True Then
    With Me.cmb顧客分類
      For i = .ListCount To 1 Step -1
        If .List(i - 1, 2) = "販売済" Then
          .RemoveItem (i - 1)
        End If
      Next
    End With
   End If

  'ここまでついか
  
  件数 = lst顧客リスト.ListCount

End Sub


◆◆やったこと

'Private Sub CheckBox1_Click()
に以下構文を追加
  Dim i As Long
  
  If Me.CheckBox1.Value = True Then
    With Me.lst顧客リスト
      For i = .ListCount To 1 Step -1
        If .Cells(.Range("顧客分類列")) = "販売済" Then
          .RemoveItem (i - 1)
        End If
      Next
    End With
  End If
  
End Sub

'Private Sub SetListBox()に以下構文を追加

Dim i As Long
  
   If Me.CheckBox1.Value = True Then
    With Me.cmb顧客分類
      For i = .ListCount To 1 Step -1
        If .List(i - 1, 2) = "販売済" Then
          .RemoveItem (i - 1)
        End If
      Next
    End With
   End If
・ツリー全体表示

【80354】カレンダーに予定を自動入力したい
質問  VBA初心者  - 19/1/31(木) 12:44 -

引用なし
パスワード
   初めまして。メーカー系の会社に勤めていて、最近VBAを勉強し始めた者です。
エクセルの表を使って業務予定を管理しているのですが、カレンダーでも予定を管理したいと思っています。
その際にエクセルに入力した予定をそのままカレンダーに反映させることは出来ないかと考え、下のようなVBAを作ってみたのですが上手く動きません。
なぜ動かないのか教えていただきたいです。
また、「もっとこうした方がいいよ」などのアドバイス等ありましたら
宜しくお願い致します。


Sub カレンダー入力()

Dim A As Date  ‘日付
Dim B As Long  ‘シリアル値
Dim Z As Long  ‘行数

Dim i As Integer ‘sheet1の最終行変数

Dim myRange As Range ‘カレンダー選択範囲
Dim myObj As Range  ‘シリアル値が一致しているセル
Dim keyWord As String ‘一致しているシリアル値
Dim firstcell As Range ‘一致しているシリアル値の最初のセル
Dim Q As Range ‘一致しているシリアル値の真下のセル

For Z = 1 To i

i = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row 'sheet1の最終行数を格納


A = Worksheets("Sheet1").Cells(Z, 1).Value ‘日付を読み取る

B = CLng(A) ‘日付をシリアル値に変更
 
Set myRange = Range("E1:K10") ‘検索したいカレンダーの範囲を選択

keyWord = B 
  
Set myObj = myRange.Find(keyWord, LookAt:=xlWhole) ‘シリアル値が一致しているセルを探す
  
  If Not myObj Is Nothing Then ‘一致したシリアル値が1つだけでなかった場合
   
   Set firstcell = myObj '最初のセルを選択
  
   Do
  
   Set myObj = Cells.FindNext(myObj) '次に一致したセルを選択

   Range(myObj).Offset(1, 0).Activate 'その真下のセルを選択
   
   Q = Range(myObj).Offset(1, 0).Activate 
   
      
      If Q = "" Then ‘真下のセルが空白だった時
     
      Set Q = Worksheets("Sheet1").Cells(Z, 2).Value ‘sheet1の値を入れる
      

      Else
       
       If VarType(ActiveCell.Offset(1, 0)) = 3 Then ‘既に文字が入っていた場合
         Set Q = Worksheets("Sheet1").Cells(Z, 2).Value & vbLf & Str(Q) 
       
       Else
         Set Q = Worksheets("Sheet1").Cells(Z, 2).Value & vbLf & Str(Q)
        
       End If
      
      End If
   
    Loop While myObj.Address <> firstcell.Address

   End If
    
Next Z  
   
End Sub
・ツリー全体表示

【80353】Re:ListView:行がどんどん増えてしまう
発言  マナ  - 19/1/30(水) 20:43 -

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

>Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
>  No = Item
>  名前 = Item.SubItems(1)
>  Call 団員登録表示処理
>  団員登録.Show
>End Sub


呼び出しが多すぎてわかりにくいですが
こうではありませんか?


Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
  No = Item
  名前 = Item.SubItems(1)
  Call 団員登録表示処理
  団員登録.Show
  Item = No
  Item.SubItems(1) = 名前
End Sub
・ツリー全体表示

【80352】Re:条件分岐について
お礼  WKB  - 19/1/30(水) 11:52 -

引用なし
パスワード
   ありがとうございます。
記述の仕方を色々勉強したかったので大変参考になりました。
・ツリー全体表示

【80351】Re:条件分岐について
回答  hatena  - 19/1/30(水) 11:14 -

引用なし
パスワード
   With Cells(i, "C")
  If .Value <> "A" And .Value <> "B" And .Value <> "C" _
    And Cells(i, "D") <> 100 Then
    処理1
  End If
End With

とか、

If Cells(i, "C") Like "[!ABCD]" And Cells(i, "D") <> 100 Then
  処理1
End If
・ツリー全体表示

【80350】条件分岐について
質問  WKB  - 19/1/30(水) 10:46 -

引用なし
パスワード
   ======================
cells(i,"C")が A・B・C・Dではない
かつ
Cell(i,"D")が 100ではない
処理1
======================
If cells(i,"C") <> "A" Then
 If cells(i,"C") <> "B" Then
  If cells(i,"C") <> "C" Then
   If cells(i,"C") <> "D" Then
    If cells(i,"D") <> 100 Then
     処理1
    End If
   End If
  End If
 End If
End If
上記コードで動くには動くんですが、
もっとスマートな記述があればご教授下さい。
・ツリー全体表示

【80349】Re:ファイルが大きくなる
お礼  総裁  - 19/1/30(水) 0:02 -

引用なし
パスワード
   ▼Jaka さん:
>手っ取り早く言うと、面倒くさがって余計な作業をしているからが多いと思う。

あっ、これやってました!
ありがとうございました。
・ツリー全体表示

【80348】Re:csvファイルの読み込み大量データ
お礼  煮詰まった  - 19/1/28(月) 9:32 -

引用なし
パスワード
   VAの解放は入れてみます。
データは新しいブックに書き込んだ方が好ましいと思う
⇒改善してみます。

ありがとうございました。
・ツリー全体表示

【80347】Re:1つのセルの内容を分解して別のセル...
お礼  煮詰まった  - 19/1/28(月) 9:29 -

引用なし
パスワード
   色々ありがとうございました。
対応方法が見えてきました
・ツリー全体表示

【80346】Re:ListView:行がどんどん増えてしまう
発言  愛沢  - 19/1/28(月) 6:51 -

引用なし
パスワード
   ※行数削除の為 Noと名前のみになっておりますが、Publicの数だけデータがあります。
'========================================================
'標準モジュール
Public No As Long
Public 名前 As String
Public レベル As Long
Public 貢献度 As Long
Public In率 As String
Public 最大戦闘力 As Long
Public 新規登録日 As String
Public 最終更新日 As String
Public 備考 As String
Public CNT1 As Long
Public CNT2 As Long
Public CNT3 As Long
Public LastCNT1 As Long
Public LastCNT2 As Long
Public WS1 As Worksheet
Option Explicit
'-------------------------------------------------------------------
Sub auto_open()
  Call 初期処理
  団員一覧.Show
End Sub

Sub 初期処理()
  Set WS1 = ThisWorkbook.Worksheets("団員一覧")
  With 団員一覧.ListView1
    .View = lvwReport      ''表示
    .LabelEdit = lvwManual   ''ラベルの編集
    .HideSelection = False   ''選択の自動解除
    .AllowColumnReorder = True ''列幅の変更を許可
    .FullRowSelect = True    ''行全体を選択
    .Gridlines = True      ''グリッド線
    '列見出し
    .ColumnHeaders.Add , "No", "No", 50
    .ColumnHeaders.Add , "名前", "名前", 50
  End With
End Sub

Sub 団員一覧表示処理()
  LastCNT1 = WS1.Cells(Rows.Count, 1).End(xlUp).Row
  CNT1 = 2
    団員一覧.ListView1.ListItems.Clear
    For CNT2 = 1 To 99
      If CNT1 <= LastCNT1 Then
        If Cells(CNT1, 2) = "" Then
          GoTo 10
        Else
          Call 団員一覧書込処理
          CNT1 = CNT1 + 1
        End If
      Else
        GoTo 10
      End If
    Next
10
End Sub

Sub 団員一覧書込処理()
  With 団員一覧.ListView1.ListItems.Item
    .Text = Cells(CNT1, 1)
    .SubItems(1) = Cells(CNT1, 2)
  End With
End Sub

Sub 団員登録表示処理()
  With 団員登録
    .TextBox1 = No
    .TextBox2 = 名前
  End With
End Sub

Sub 団員登録更新処理()
  With 団員登録
    No = .TextBox1
    名前 = .TextBox2
  End With
  
  With 団員一覧.ListView1.ListItem
    .Text = No
    .SubItems(1) = 名前
  End With
End Sub

Sub 更新チェック()
'未着手
End Sub

'========================================================
'団員一覧フォーム
Private Sub CommandButton2_Click()
  Unload Me
End Sub

Private Sub CommandButton3_Click()
  Call 団員一覧表示処理
End Sub

Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
  No = Item
  名前 = Item.SubItems(1)
  Call 団員登録表示処理
  団員登録.Show
End Sub

'========================================================
'団員登録フォーム
Private Sub CommandButton2_Click()
'  Call 更新チェック
  Unload Me
End Sub

Private Sub CommandButton3_Click()
  Call 団員登録更新処理
End Sub

Private Sub TextBox7_Change()
  TextBox7.Locked = True
End Sub
'========================================================
・ツリー全体表示

【80345】Re:ListView:行がどんどん増えてしまう
質問  愛沢  - 19/1/28(月) 6:37 -

引用なし
パスワード
   マナ様ご返答ありがとうございます。

>>  With 団員一覧.ListView1.ListItems.Add
>
>ここで.addしているからではありませんか。

.addを削除いたしました。

==============================
Sub 団員登録更新処理()
  With 団員一覧.ListView1.ListItem
        
    .Text = No
    .SubItems(1) = 名前

==============================
Private Sub CommandButton3_Click() 

  Call 団員一覧表示処理 <= 引数は省略できません

End Sub
==============================

と出るようになりました

これはCommandButton3_Clickの()に引数を入れるという事でしょうか?
Private Subはお決まりのような定型引数?があるみたいなのですが、コマンドボタンに対しては()しか載っていないようで


追伸
これは前回の質問でも引っかかったのですが、VBAの引数について今一理解が出来ておりません
仕事の都合で急にVBAを1-2か月、フォームを10日程しか触っていないので、当然といえば当然かもしれませんが、図書館とかに行ってVBAだけの本を参考にして勉強したほうがいいのでしょうか?(NetだとCとかVBが検索にひっかかりまくって中々検索が進みません
なにかListViewについてよくわかるサイト、本が有ればいいのですが
・ツリー全体表示

【80344】Re:ファイルが大きくなる
発言  Jaka  - 19/1/28(月) 1:28 -

引用なし
パスワード
   手っ取り早く言うと、面倒くさがって余計な作業をしているからが多いと思う。

例えば、使用範囲or必要部分のみコピペすればいいものをセル全体をコピペするとか。
(エクセルに手慣れていると思っている人が、面倒くさがって急ぐからこうすることが多い。)

まあ、

>使用していない行(末行よりも下のすべての行、使用している右端行よりも右側にあるすべての列)を削除すれば元のサイズに戻るのですが

ということなんで、面倒くさがって余計な作業をしているからだろうね。
因みに古いエクセルだと、なんか知らんがこれやるとデータが無いのにサイズが増えてた。
・ツリー全体表示

【80343】Re:ファイルが大きくなる
発言  よろずや  - 19/1/27(日) 21:42 -

引用なし
パスワード
   どんな処理をしてるのか判らなければ回答のしようがない。
・ツリー全体表示

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