Excel VBA質問箱 IV

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

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


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

【79619】Re:指定期間でログインしたユーザーを知...
回答  亀マスター  - 18/2/14(水) 21:03 -

引用なし
パスワード
   col1とcol3の値に問題があると思います。
いずれも値が1になっているので、Forループからすぐに抜けてしまうようです。

    cols1 = .UsedRange.Cells(.UsedRange.Rows.Count, 1).Column
    cols3 = .UsedRange.Cells(.UsedRange.Rows.Count, 1).Column

これはいずれもColumnがRowの誤りでしょう。
CellsプロパティでColumnを1に指定しているのですから、そこから得られたセルのColumnを取得すれば1にしかなりません。

それと、これを修正しても問題が残っています。
ループに入ってからの
    If ws6.Range("B" & migi).Value = ws1.Range("D" & hida).Value Then
ですが、migiはmaster(ws1)の行数、hidaはdaily3(ws6)の行数を表しているのですから、ここでは逆でしょう。

同じく、
    ws3.Range("A" & hida).Value = ws1.Range("B" & hida).Value
    ws3.Range("B" & hida).Value = ws1.Range("D" & hida).Value
    ws3.Range("C" & hida).Value = ws1.Range("C" & hida).Value
    ws3.Range("D" & hida).Value = ws1.Range("A" & hida).Value
は、いずれも=の右側の式でhidaをmigiに修正する必要があると思われます。

以上で、私が手元で試してみた範囲では動作しました。


なお、動作には支障がないのですが、変数名は直した方がいいですね。ws1とかcols1とかhidaとか、何を表しているのかわかりません。私がコードを読む際にも、結構読みにくかったですよ。
ws1ならsh_masterのような、中身がわかる変数名にするか、いっそのこと変数を使わずにWorksheets("master")だけでもいいのではないでしょうか。

それに、シートの選択方法が、ws1のような変数を使ったり、Worksheet("シート名")になっていたり、ActiveSheetになっていたりで、やはりどのシートを指定しているのかがわかりにくいです。特にActiveSheetは手前のコードを読んでどこのシートがアクティブになっているのかを調べないとわかりませんし、そもそもそのシートをアクティブにする処理が余計です。

あと、サンプル程度のデータ量ならこれでもすぐ終わると思いますが、件数が多くなってくるとセルの読み書きの回数が多くなり、処理に時間がかかるようになりますよ。
Variant型変数にセル範囲を代入して配列として扱う方法がありますので、余裕があれば勉強してみてはどうでしょうか。
ht tp://officetanaka.net/excel/vba/speed/s11.htm
・ツリー全体表示

【79618】指定期間でログインしたユーザーを知りた...
質問  amatsuno E-MAIL  - 18/2/14(水) 16:19 -

引用なし
パスワード
   指定期間内にログインしたユーザの取得を実施したい

指定した期間内にログインしたユーザの情報を取得したいと思っています。
以下の方針で取得する想定です。

使用ファイル:
master.csv ⇒ 全体のマスタ情報が格納されている
daily.csv ⇒ 直近60日程度の情報が格納されている

check.xlsm ⇒ VBAを設定するファイル
        シート「master」「daily」「daily2」「daily3」「match」「BTN」がある


手順:
1.master.csvを読み込み、全体のマスタ情報を取得する
2.daily.csv情報を読み込み、直近のログイン情報を取得する
3.読み込んだdaily情報から、指定期間(2018/1/1〜2018/2/1)のレコード(アドレス)を抽出する
4.抽出した情報から、第4カラムが「FALSE」のもののみを抽出する
5.上記の4.で抽出した情報とmaster情報を紐付ける


想定では、test12@kkkk.onmicrosoft.comが出力されると思っていましたが、
何も抽出されませんでした。

どこが間違っていたのでしょうか?

お分かりになられる方、よろしくお願いいたします


コードは、以下のように作成しました

Option Explicit

Sub CSV_MATCH()
  '指定期間内のログイン情報を抽出する
  
  Dim hida As Long
  Dim migi As Long
  Dim cols1 As Long
  Dim cols2 As String
    Dim cols4 As String
  Dim cols3 As Long
  Dim stdate As String
  Dim eddate As String
  Dim ws1 As Worksheet
  Dim ws2 As Worksheet
  Dim ws3 As Worksheet
  Dim ws4 As Worksheet
  Dim ws5 As Worksheet
  Dim ws6 As Worksheet
  
  Set ws1 = Worksheets("master")
  Set ws2 = Worksheets("daily")
  Set ws3 = Worksheets("match")
  Set ws4 = Worksheets("BTN")
  Set ws5 = Worksheets("daily2")
  Set ws6 = Worksheets("daily3")
  
  With Sheets("master")
  cols1 = .UsedRange.Cells(.UsedRange.Rows.Count, 1).Column
  End With
  
'  With Sheets("daily")
'  cols2 = .UsedRange.Cells(.UsedRange.Rows.Count,1).Column
'  End With
  
  '日付範囲を指定した日次情報の貼り付け先(daily2)を空白にする
  ws5.Cells.Clear
  ws6.Cells.Clear
  ws2.Activate
  

  ActiveSheet.AutoFilterMode = False
  
  '抽出する日次情報の範囲を指定する
  stdate = InputBox("データ抽出開始日を入力してください。(2018/1/1形式で入力)")
  eddate = InputBox("データ抽出終了日を入力してください。(2018/1/1形式で入力)")
  
  '日付範囲を指定した日次情報をdaily2へ貼り付ける
  Range("A1").AutoFilter Field:=1, Criteria1:=">=" & stdate, Operator:=xlAnd, Criteria2:="<=" & eddate
  ws2.Range("A1").CurrentRegion.Copy ws5.Range("A1")
  ws2.AutoFilterMode = False

  'ログイン情報の貼り付け先(match)を空白にする
  ws3.Cells.Clear
  
  ws5.Activate
    
  Dim i, LastRow As Long
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 1 To LastRow
    If Cells(i, 4) = False Then
    Rows(i).Copy Sheets("daily3").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
    End If
    Next i


  With Sheets("daily3")
  cols3 = .UsedRange.Cells(.UsedRange.Rows.Count, 1).Column
  End With

          
   '日付情報のメールアドレスとマスタ情報のメールアドレスが一致したレコードを、matchに貼り付ける
  For migi = 1 To cols1
      Application.StatusBar = "処理実行中....(現在 " & migi & "件)"
    For hida = 1 To cols3
      If ws6.Range("B" & migi).Value = ws1.Range("D" & hida).Value Then
        ws3.Range("A" & hida).Value = ws1.Range("B" & hida).Value
        ws3.Range("B" & hida).Value = ws1.Range("D" & hida).Value
        ws3.Range("C" & hida).Value = ws1.Range("C" & hida).Value
        ws3.Range("D" & hida).Value = ws1.Range("A" & hida).Value
        Exit For
      End If
    Next
    ws3.Range("H" & hida).Value = migi
    ws3.Range("I" & hida).Value = hida
  Next
  
    Application.StatusBar = "処理完了....(全 " & migi - 1 & "件)"
    
  '抽出した情報を部署単位で並び替える
  ws3.Activate
  ws3.Range("A:K").Sort Key1:=Range("D1"), order1:=xlAscending
    
  '初期画面に戻る
  ws4.Activate

End Sub


daily.csv

Date,Name,Display, Deleted
2018/2/7,test3@kkkk.onmicrosoft.com,テスト 3,FALSE
2018/2/7,test4@kkkk.onmicrosoft.com,テスト 4,FALSE
2018/2/7,test5@kkkk.onmicrosoft.com,テスト 5,FALSE
2018/2/7,test6@kkkk.onmicrosoft.com,テスト 6,FALSE
2018/2/7,test7@kkkk.onmicrosoft.com,テスト 7,FALSE
2018/2/7,test8@kkkk.onmicrosoft.com,テスト 8,FALSE
2018/2/7,test9@kkkk.onmicrosoft.com,テスト 9,FALSE
2018/2/7,test10@kkkk.onmicrosoft.com,テスト 10,FALSE
2018/1/9,test11@kkkk.onmicrosoft.com,テスト 11,TRUE
2018/1/9,test12@kkkk.onmicrosoft.com,テスト 12,FALSE

master.csv

COL1,COL2,COL3,mail,COL4
Mod,TMTM43045,KM4,ssstest3@kkkk.onmicrosoft.com,1043045
Mod,aaTMTM43046,KM5,tsssest3@kkkk.onmicrosoft.com,1043046
Mod,aaTMTM43047,KM6,ssstest3@kkkk.onmicrosoft.com,1043047
Mod,aaTMTM43048,KM7,ssstest3@kkkk.onmicrosoft.com,1043048
Mod,aaTMTM43049,KM8,ssstest3@kkkk.onmicrosoft.com,1043049
Mod,aaTMTM43050,KM4,test3@kkkk.onmicrosoft.com,1043050
Mod,aaTMTM43056,KM4,test9@kkkk.onmicrosoft.com,1043056
Mod,aaTMTM43045,KM4,test10@kkkk.onmicrosoft.com,1043045
Mod,aaTMTM43046,KM5,test11@kkkk.onmicrosoft.com,1043046
Mod,aaTMTM43047,KM6,test12@kkkk.onmicrosoft.com,1043047
Mod,aaTMTM43048,KM7,test13@kkkk.onmicrosoft.com,1043048
・ツリー全体表示

【79617】Re:決まった文字の前に数字を入れたいの...
発言  マルチネス  - 18/2/13(火) 23:31 -

引用なし
パスワード
   こちらではマルチポストは容認されてます(推奨されているわけではない)が、↓では禁止されています。


ht tp://excelfactory.net/excelboard/excelvba/excel.cgi?mode=all&namber=184563&rev=0
・ツリー全体表示

【79616】Re:決まった文字の前に数字を入れたいの...
発言  亀マスター  - 18/2/13(火) 21:43 -

引用なし
パスワード
   ここの掲示板は丸投げ禁止です。
一度でも自分でなんとかしようとしましたか?

関数でやるにしてもVBAでやるにしても、少し調べればできる内容です。
・ツリー全体表示

【79615】決まった文字の前に数字を入れたいので教...
質問  まい  - 18/2/13(火) 21:31 -

引用なし
パスワード
   B2のセルに0000.jpg とあったらC2のセルに0000_1.jpgと入る
B2のセルに0000.jpg とあったらC3のセルに0000_2.jpgと入る
B2のセルに0000.jpg とあったらC4のセルに0000_3.jpgと入る
B2のセルに0000.jpg とあったらC5のセルに0000_4.jpgと入る

B6のセルに1111.jpgとあったらC6のセルに1111_1.jpgと入る
B6のセルに1111.jpgとあったらC7のセルに1111_2.jpgと入る
B6のセルに1111.jpgとあったらC8のセルに1111_3.jpgと入る
B6のセルに1111.jpgとあったらC9のセルに1111_4.jpgと入る

ように、_1 _2 _3 _4 を.jpgの前に入るようにしたいです。


関数かマクロ教えてください
・ツリー全体表示

【79614】Re:データを別のブックのシートにペース...
回答  γ  - 18/2/6(火) 21:27 -

引用なし
パスワード
   単に止まるだけでなく、なんらかの文章が表示されるでしょ?
それをエラーメッセージといいます。
それを書き写して教えてください。
・ツリー全体表示

【79613】Re:データを別のブックのシートにペース...
回答  VBASHOSIN  - 18/2/6(火) 21:15 -

引用なし
パスワード
   お世話になります。
このVBAをマクロ実行すると途中で止まり、"ActiveSheet.Paste Destination:=Worksheets("当月").Range("A3")"の部分が黄塗りになります。よろしくお願いします。
・ツリー全体表示

【79612】Re:データを別のブックのシートにペース...
回答  γ  - 18/2/6(火) 20:47 -

引用なし
パスワード
   なんというエラーメッセージですか?
エラーがでますだけでなく、内容も説明してください。
・ツリー全体表示

【79611】データを別のブックのシートにペーストす...
質問  VBASHOSHIN  - 18/2/6(火) 14:31 -

引用なし
パスワード
   お世話になっております。

以下のVBAを作ったのですが、"ActiveSheet.Paste Destination:=Worksheets("当月").Range("A3")"がエラーになってしまいます。どのように修正すればよいか
教えてください。

Sub CH()
Columns("a:e").Copy
Application.FindFile
Workbooks("B").Worksheets("当月").Activate
ActiveSheet.Paste Destination:=Worksheets("当月").Range("A3")
End Sub

やりたい事
1)開いているブックのシートにあるA列からE列をコピー。
2)貼り付けるブックを選択。
3)貼り付け先のブックの「当月」シートをActivateにする。
4)「当月」シートのA3から貼り付けたい。

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

【79610】Re:Byte型1次元配列に入っているBMPデー...
回答  Abyss2  - 18/2/5(月) 1:21 -

引用なし
パスワード
   配列の先頭値は確認しましたか?

つまり、BMPファイル形式なら
aaa(0) = 66
aaa(1) = 77

JPGファイル形式なら
aaa(0) = 255
aaa(1) = 216

のはずです。これ以外だと失敗します。
・ツリー全体表示

【79609】Re:Byte型1次元配列に入っているBMPデー...
発言  say_d  - 18/2/4(日) 23:34 -

引用なし
パスワード
   Abyss2さんありがとうございます。
ご教授頂いたキーワードをもとに調べてみたところVBAではなくVBの内容ですが以下のページが参考になりそうでした。

yaplog.jp/orator/archive/19

まさに私のやりたい事が関数サブルーチンとして作られていそうです。
ただ、今のところうまくいっておりません。
上記ページの関数部分及び、宣言部を転記して

  Set UserForm1.Image1.Picture = BytesToPicture(aaa())

としても何も表示されません。
まだ、調べてみたいと考えていますがもしよろしければアドバイスが頂ければ嬉しいです。


▼Abyss2 さん:
>既にBMPバイト配列を手元に持っているならば
>配列をIStreamオブジェクトに乗せてから
>OleLoadPictureでUserFormに表示する手順がラクだと思いますね。
>
>msdn.microsoft.com/ja-jp/library/windows/desktop/ms693724(v=vs.85).aspx
・ツリー全体表示

【79608】Re:Byte型1次元配列に入っているBMPデー...
回答  Abyss2  - 18/2/4(日) 22:22 -

引用なし
パスワード
   既にBMPバイト配列を手元に持っているならば
配列をIStreamオブジェクトに乗せてから
OleLoadPictureでUserFormに表示する手順がラクだと思いますね。

msdn.microsoft.com/ja-jp/library/windows/desktop/ms693724(v=vs.85).aspx
・ツリー全体表示

【79607】Byte型1次元配列に入っているBMPデータを...
発言  say_d  - 18/2/3(土) 22:45 -

引用なし
パスワード
   質問:Excel VBAでBMP画像をbyte型の1次元配列に取り込んであります。そのデータをuserform上に配置したimageへ表示する事はできますか?

なぜ必要か?:Excel VBAでBMPデータをByte型に取り込んで1ピクセル単位で画像を処理しています。その結果を表示して確認したいのですがbmpファイルに書き出して確認をするとかなり時間がかかる為、userform上に表示して素早く目視確認をしたので。

具体的には、ビットマップをクリップボード経由で aaa()as byte に取り込み済みで UserForm1.Image1.Picture = LoadPicture(aaa())のような形で表示できればと考えています。

どなたかご教授お願いいたします。
・ツリー全体表示

【79606】Re:VBA 時間集計
発言  γ  - 18/2/2(金) 22:36 -

引用なし
パスワード
   >また、2 は、1900/1/2 0:00:00 と数式バーには表示されます。
>そして、そのセルの書式を[h]:mm としておけば、
>そのセルは 48:00 と表示されるはずです。
そうならないのは、「なぞなぞ」のようで解りかねます。

普通では考えられないことが起きているときは、
・それぞれのセルの位置に何を入力したのかを説明し、
・省略しないコードを一式提示する
ことによって、
他人が「その状況を再現できる」ようにすることが必要です。
・ツリー全体表示

【79605】Re:VBA 時間集計
発言  初心者CORAZON  - 18/2/2(金) 8:07 -

引用なし
パスワード
   ▼γ さん:
>> ZAN の値が 24時間のとき outsh.Cells(Y, 7).Value が 
>> 0となります (1900/1/1 0:0:0 ?) 
>0ではありません。   
>24時間は、整数の1と同じです。
>そして、日付型は、1900/1/1 を起点(1) としてカウントする決まりです。
>ですから、数式バー? には、1900/1/1 0:00:00 と表示されて正常です。
>
>また、2 は、1900/1/2 0:00:00 と数式バーには表示されます。
>そして、そのセルの書式を[h]:mm としておけば、
>そのセルは 48:00 と表示されるはずです。
>
>何も問題がありません。

いろいろとありがとうございます。

では、数式バーは 1900/1/1 0:00:00 となった場合
最終セルには 0:00 となってしまいます。 
結論は 24 と表示したいのです。(残業時間 24時間 に意味)
方法はありませんか?

48時間の場合 42 と表記されました。
そのほかの時間も問題なく表記されます。 

無理を言いますがお教えください。
・ツリー全体表示

【79604】Re:最終行が取得できません...
回答  γ  - 18/2/2(金) 7:39 -

引用なし
パスワード
   特定のシートモジュールに書かれたプロシージャだったということですか?

シートモジュールのプロシージャでシートを省略すると
「そのプロシージャが書かれたシート」が前提になります。
どのシートがアクティブかは関係しません。

一方、標準モジュールに書かれたプロシージャで、シートを省略すると、
「その時にアクティブなシート」が指定されたことになります。

この違いをよく理解して下さい。

デバッグを最初からしているなら、その結果をキチンと質問中に
織り込んで下さい。そのほうが双方の時間が節約できます。
また、基本的なことが理解されているかも判明しますから。
・ツリー全体表示

【79603】Re:最終行が取得できません...
お礼  [名前なし]  - 18/2/1(木) 23:54 -

引用なし
パスワード
   無事解決いたしました!
デバックももちろん一番に試しましたが、うまくいきませんでした。
シートをアクティブ化することでうまくいきました、ありがとうございました。
P.S.名前が名無しだったのは一度目の投稿で名無しにしてしまったので、次回も名無しのほうがわかりやすいと思ったからです。
▼γ さん:
>> 何か他に設定で変更しきれていなかったり、あるんでしょうか?
>
>その前に、私の助言はどうなりましたか?
>> ステップ実行というデバッグ手法をご存じですか?
>> F8キーを使うものです。
>> それで一行毎に実行して、変数の値が想定どおりとなっているか確認してください。
>
>Application.Run の前まで実行した段階で、
>以下の変数には何が入っているか回答してください。
>
>i
>c_addr1
>c_addr2
>start_cell
>end_cell
>data_range
>
>一つ気になるのは、アドインを使用できる状態になっているかですが、
>分析ツール - VBA はチェックを入れていますよね。
>入れていなければ、別のエラーメッセージのはずなので、そこはOKだと思いますが。
>
>あとは、対象データのあるシートがアクティブシートになっているかぐらいでしょうか。
>
># 名前なし というのはなぜ?
・ツリー全体表示

【79602】Re:VBA 時間集計
回答  γ  - 18/2/1(木) 22:50 -

引用なし
パスワード
   > ZAN の値が 24時間のとき outsh.Cells(Y, 7).Value が 
> 0となります (1900/1/1 0:0:0 ?) 
0ではありません。   
24時間は、整数の1と同じです。
そして、日付型は、1900/1/1 を起点(1) としてカウントする決まりです。
ですから、数式バー? には、1900/1/1 0:00:00 と表示されて正常です。

また、2 は、1900/1/2 0:00:00 と数式バーには表示されます。
そして、そのセルの書式を[h]:mm としておけば、
そのセルは 48:00 と表示されるはずです。

何も問題がありません。
・ツリー全体表示

【79601】Re:VBA 時間集計
発言  初心者CORAZON  - 18/2/1(木) 14:39 -

引用なし
パスワード
   ▼γ さん:
>>VBA側で試してみても、中間フィールドの設定により
>>型が違いますとなります。
>
>現時点のコードを提示して下さい。
ご連絡ありがとうございます。

抜粋すると以下の内容です。

ZAN の値が 24時間のとき outsh.Cells(Y, 7).Value が 
0となります (1900/1/1 0:0:0 ?)
prefsh.Cells(x, 7).Valueとoutsh.Cells(Y, 7).Valueの
帳票EXCEL の書式が [h]:mm です。

---------

 Dim Y As Long
 Dim zan As Date  ← AS Long に変更するとタイプがエラー

 Dim shin As Date
'
 〜途中略〜
'
  If oldcd = prefsh.Cells(x, 1).Value Then
    'その行の 残業・深夜時間
    zan = zan + CDate(prefsh.Cells(x, 7).Value)
    shin = shin + CDate(prefsh.Cells(x, 8).Value)
   Else
 
〜途中略〜
  '結果を保存
  outsh.Cells(Y, 7).Value = zan
・ツリー全体表示

【79600】Re:VBA 時間集計
発言  γ  - 18/2/1(木) 12:51 -

引用なし
パスワード
   >VBA側で試してみても、中間フィールドの設定により
>型が違いますとなります。

現時点のコードを提示して下さい。
・ツリー全体表示

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