Excel VBA質問箱 IV

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

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


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

【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 -

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

【80342】ファイルが大きくなる
質問  総裁  - 19/1/27(日) 20:42 -

引用なし
パスワード
   VBAで処理を実行させた後、保存するとファイルの容量が非常に大きくなってしまうことが時々起こります。

使用していない行(末行よりも下のすべての行、使用している右端行よりも右側にあるすべての列)を削除すれば元のサイズに戻るのですが
どのようなことに気を付ければよいのでしょうか。
・ツリー全体表示

【80341】Re:ブックの分割方法
発言  マナ  - 19/1/27(日) 14:19 -

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

>1.3つのブックを新規作成し、シート名前をYYにする。
>2.XX.xlsxを3つのブックにコピーする。
>3.1行目をフィルタにして、ブックごとに特進、スーパー、一般が残るように削る
>4.保存
>
>という手順でやってるのですが、他に良い方法があるのではないかと思います。
>いかがでしょうか。

シートごとコピーするとよいです

1.新規ブックに、シートYYをコピーする。
2.「特進」以外をフィルタで抽出し、削除
3.フィルタ解除
4.名前を付けて保存
5.「スーパー」と「一般」も同様に
・ツリー全体表示

【80340】Re:ListView:行がどんどん増えてしまう
発言  マナ  - 19/1/27(日) 14:06 -

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

 
>  With 団員一覧.ListView1.ListItems.Add

ここで.addしているからではありませんか。
・ツリー全体表示

【80339】ListView:行がどんどん増えてしまう
質問  愛沢  - 19/1/27(日) 11:04 -

引用なし
パスワード
   【80335】ListView:引数は省略できません。の続きとなります。

前回はありがとうございました。

ゲームの団員一覧を作成しようと思い後々誰でも弄れるような仕様にしたく作っております。

1.【auto_open】で【Listview】の初期処理
2.【読込ボタン】を押すと団員リストを読み込み
3.Listviewをクリックすると登録フォームを開く
4.登録フォームから【更新ボタン】を押すと同じ行のデータを上書きする。

の4番でつまづいております。

'==================================

Sub 団員登録更新処理()

  With 団員登録
    
    No = .TextBox1
    名前 = .TextBox2
    レベル = .TextBox3
    貢献度 = .TextBox4
    In率 = .TextBox5
    最大戦闘力 = .TextBox6
    最終更新日 = Date
    備考 = .TextBox8
      
  End With
  
  With 団員一覧.ListView1.ListItems.Add
        
    .Text = No
    .SubItems(1) = 名前
    .SubItems(2) = レベル
    .SubItems(3) = 貢献度
    .SubItems(4) = In率
    .SubItems(5) = 最大戦闘力
    .SubItems(6) = 最終更新日
    .SubItems(7) = 備考

  End With

End Sub
'==================================

登録フォームを開く、内容を編集する、更新ボタンを押す
を作成したのですが、
帰ってきたデータをそのまま返しても次に新しい行が作られます

No    名前    レベル    貢献度    
1    愛沢    48    100000    
2    ヘラ    666    666666    

とあるデータに更新を押すと
No    名前    レベル    貢献度    
1    愛沢    48    100000    
2    ヘラ    666    666666
2    ヘラ    666    666666
2    ヘラ    666    666666
2    ヘラ    666    666666

と押す度に増えていきます。
 ※見づらい為5カラム目以降は省略しております。

流石に、この部分に対して【団員一覧.ListView1.ListItems.Clear】とやってしまうと全部消えてしまいますし・・・

お手すきの方がいらっしゃいましたら、よろしくお願いいたします。
・ツリー全体表示

【80338】ブックの分割方法
質問  宮本  - 19/1/27(日) 11:03 -

引用なし
パスワード
   XX.xlsxsのYYシートにはA列がクラス、B列が得点となっています。
一例を下に示します。
クラスごとにブック分割を行い、FY2018_特進.xlsx、FY2018_スーパー.xlsx、FY2018_一般.xlsxとしたいと思います。シート名前はいずれのブックもYYのままです。

1.3つのブックを新規作成し、シート名前をYYにする。
2.XX.xlsxを3つのブックにコピーする。
3.1行目をフィルタにして、ブックごとに特進、スーパー、一般が残るように削る
4.保存

という手順でやってるのですが、他に良い方法があるのではないかと思います。
いかがでしょうか。
Excel2010を使っています。
可能でしたらスクリプトも示していただけると助かります。
よろしくお願いいたします。

【XX.xlsxのYYシート】
クラス    点数
特進    82
スーパー    84
スーパー    88
一般    57
特進    94
一般    82
スーパー    73
一般    46
特進    97
一般    69
一般    74
スーパー    72
一般    53
特進    92


【FY2018_特進.xlsxのYYシート】
クラス    点数
特進    82
特進    94
特進    97
特進    92
    
    
【FY2018_スーパー.xlsxのYYシート】
クラス    点数
スーパー    84
スーパー    88
スーパー    73
スーパー    72
    
    
【FY2018_一般.xlsxのYYシート】
クラス    点数
一般    57
一般    82
一般    46
一般    69
一般    74
一般    53
・ツリー全体表示

【80337】Re:ListView:引数は省略できません。
お礼  愛沢  - 19/1/27(日) 7:08 -

引用なし
パスワード
   亀マスター様
ご返答ありがとうございます。
ListviewはVB等色々検索に引っかかってしまい中々進むことができず助かります

サンプルプログラムを改変して作ってた弊害でした。
お手間をおかけして申し訳ございません。

Private Sub ListView1_ItemClickに対して
MSComctlLib.ListItem引数固定かと思っておりました・・・

ネット検索だけでは限界がありそうですので、図書館とネットで作業してみたいと思います。

一応変数を間に挟むことで解決は致しました。

またほかのバグが出てきたので新規スレッドの方がいいのでしょうかね?
もう少しググって出来なければお力を拝借しようかと思います。

失礼いたします。
・ツリー全体表示

【80336】Re:ListView:引数は省略できません。
回答  亀マスター  - 19/1/27(日) 1:23 -

引用なし
パスワード
   具体的のどのようなコードのどこでエラーが発生しているかがわからないので回答ができないですが、「引数は省略できません。」であれば、そのままの意味です。何らかの関数やプロパティなどの呼び出しの際、必要な個数の引数が指定されていないということです。

例えば、MsgBoxであれば第1引数に表示するメッセージを指定する必要がありますし、これは自分で作ったSubやFunctionでも、引数を指定する必要がある構造にしていれば同様です。

Sub 例()

  '引数が指定されていない
  MsgBox
  Range("A1").End.Select
  Range("A1") = nibai

  '3つの引数が必要なのに2つしか指定されていない
  Range("A1") = Replace("abcde", "a")

End Sub

Function nibai(a) As Long

  nibai = a * 2

End Function
・ツリー全体表示

【80335】ListView:引数は省略できません。
質問  愛沢  - 19/1/26(土) 19:26 -

引用なし
パスワード
   初歩的な事で申し訳ございません。
かれこれ5時間近くエラーと戦っていますが、エラー元が見当つきません・・・

ゲームの団員一覧を作成しようと思い後々誰でも弄れるような仕様にしたく作っております。

1.【auto_open】で【Listview】の初期処理
2.【読込ボタン】を押すと団員リストを読み込み
3.Listviewをクリックすると登録フォームを開く

迄は完成したのですが、3のListviewにクリックすると登録フォームを開いた際、【開いた時その行のデータを読み込む】を追加すると【引数は省略できません。】のエラーを始め記載調整する度に様々なエラーに悩まされております。


Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
  
'  Call 団員登録表示処理 '通常モジュールに転移予定

  With 団員一覧.ListView1.ListItems
    TextBox1 = .Item
    TextBox2 = .Item.SubItems(1)
  End With
  
  団員登録.Show

End Sub

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

【80334】Re:教えてください
発言  マナ  - 19/1/26(土) 1:12 -

引用なし
パスワード
   ▼ミリヤ さん:

こっちに移動ですか
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=80330;id=excel
・ツリー全体表示

【80333】Re:vba詳しい方、お力貸してください
発言  マナ  - 19/1/26(土) 0:44 -

引用なし
パスワード
   ▼ミリヤ さん:

>上記をまず、一つのコードにしたいです。

1人分だけコピーするなら
こんな感じでできませんか。


Sub test()
  Dim myPath As String
  Dim fName As String
  Dim wb勤務 As Workbook
  Dim wb管理 As Workbook

  myPath = "C:\Users\user\Desktop\〇〇さんへ\12月\"
  fName = Dir(myPath & "*勤務表*.xlsx")
  Set wb勤務 = Workbooks.Open(myPath & fName)

  myPath = "C:\Users\user\Desktop\〇〇さんへ\管理用勤務表\"
  Set wb管理 = Workbooks.Open(myPath & "【管理用】" & fName)

  wb勤務.Sheets("12月").Copy Before:=wb管理.Sheets(11)
  
  wb勤務.Close False
  wb管理.Close True

End Sub

 
・ツリー全体表示

【80332】Re:VBA 行削除について
お礼  文鳥  - 19/1/25(金) 22:53 -

引用なし
パスワード
   ▼ごごご さん:
>Autofilterをかけたたあと
>L列に0の値があるときは
>Cells(Rows.Count, "L").End(xlUp).Value
>の値はOになっているはずなので条件分岐してください

ご回答ありがとうございます。
条件分岐してみます。
・ツリー全体表示

【80331】Re:VBA 行削除について
お礼  文鳥  - 19/1/25(金) 22:52 -

引用なし
パスワード
   ▼亀マスター さん:
>フィルターをかけたときに抽出された件数を数えて、
>それがゼロだったらDeleteをしないということでいいのではないでしょうか。
>
>参考
>フィルタで抽出したデータの数をカウントする
>ht tps://www.moug.net/tech/exvba/0150043.html

ご回答ありがとうございます。
やってみます。
・ツリー全体表示

【80330】vba詳しい方、お力貸してください
質問  ミリヤ  - 19/1/25(金) 10:32 -

引用なし
パスワード
   下記マクロを組みました。

Sub 管理用ファイルをまとめて開く()
  Dim keyword As String
  Dim myPath As String
  Dim fName As String

  keyword = "管理用"
  myPath = "C:\Users\user\Desktop\〇〇さんへ\管理用勤務表\"
  fName = Dir(myPath & "*" & keyword & "*" & ".xlsx")

  If fName = "" Then
    MsgBox ("該当するファイルが存在しません。")
    Exit Sub
  End If

  Do Until fName = ""
    Shell ("explorer.exe " & myPath & fName)
    fName = Dir()
  Loop
  
End Sub

Sub 勤務表ファイルをまとめて開く()
  Dim keyword As String
  Dim myPath As String
  Dim fName As String

  keyword = "勤務表"
  myPath = "C:\Users\user\Desktop\〇〇さんへ\12月\"
  fName = Dir(myPath & "*" & keyword & "*" & ".xlsx")

  If fName = "" Then
    MsgBox ("該当するファイルが存在しません。")
    Exit Sub
  End If

  Do Until fName = ""
    Shell ("explorer.exe " & myPath & fName)
    fName = Dir()
  Loop
  
End Sub
Sub 対象ファイル同士のシートコピー()
'
' Macro2 Macro
'

'
  Windows("2018年度勤務表_69〇〇.xlsx").Activate
  Sheets("12月").Select
  Sheets("12月").Copy Before:=Workbooks("【管理用】2018年度勤務表_69〇〇.xlsx").Sheets(11)
  ActiveWorkbook.Save
  ActiveWindow.Close
  ActiveWindow.Close
End Sub


・上記をまず、一つのコードにしたいです。
(一気に処理できるように)
・シートのコピーは今はシート指定しているのですが、ファイルは複数ある為
〇〇部分が一致する者同士を自動でシートコピーさせたいです。

お力貸していただけませんでしょうか。
宜しくお願いします。
・ツリー全体表示

【80329】Re:教えてください
発言  ミリヤ  - 19/1/25(金) 10:06 -

引用なし
パスワード
   ▼マナ さん:
Windows("2018年度勤務表_69江田中太郎.xlsx").Activate
  Sheets("12月").Select
  Sheets("12月").Copy Before:=Workbooks("【管理用】2018年度勤務表_69田中太郎.xlsx").Sheets(11)

逆でした。。。
・ツリー全体表示

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