Excel VBA質問箱 IV

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

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


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

【79624】OSのBit数判定
質問  タロサ  - 18/2/19(月) 13:33 -

引用なし
パスワード
   OSが32Bitか64Bitかを判定したいのですが、
分かる方が居ましたらご教授下さい。
・ツリー全体表示

【79623】Re:VBAで、複数の条件を出力させたい
発言  γ  - 18/2/16(金) 21:16 -

引用なし
パスワード
   解決されたようですが、こんな方法が普通かもしれませんね。

  For i = 1 To reccount
    If Cells(i, 3).Value = False Or _
      (Cells(i, 3).Value = True _
       And Cells(i, 4).Value >= DATE_ST _
       And Cells(i, 4).Value <= DATE_ED) Then
      Rows(i).Copy newsheets.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
    End If
  Next i
(Cells(i, 3).Valueは False か True のいずれかと限定できないものとしました)


なお、
Dim i, reccount As Long
は不可です( i は Variant型です)。
Dim i As Long, reccount As Long
とします。
・ツリー全体表示

【79622】Re:VBAで、複数の条件を出力させたい
発言  amatsuno  - 18/2/16(金) 16:50 -

引用なし
パスワード
   すいません。

自己解決しました。

手順は以下で対応しました

1.COL-3がFALSEのみを抽出する
(ここで、NAME1〜3が抽出される)

2.COL-4が2018/1/1〜2018/2/1のみを抽出する
(ここで、NAME3・NAME6が抽出される)

3.重複削除を行う
(ここで、NAME3が消える)
・ツリー全体表示

【79621】VBAで、複数の条件を出力させたい
質問  amatsuno  - 18/2/16(金) 13:37 -

引用なし
パスワード
   VBAのコードで、複数のセルの入力条件を持つレコードを出力させたいと思っています

以下のcsvを読み込み、

指定条件のレコードを別セルに抽出したいと思っています

抽出条件は以下の通りです。
(以下1.2.を両方同時に出力します)

・文字列「COL-3がFALSE」のものは抽出する
・文字列「COL-3がTRUE」、かつ「COL-4が2018/1/1〜2018/2/1」のものは抽出する」


具体的には、
以下のCSVより、
NAME1
NAME2
NAME3
NAME6
を出したいと思っています。

ORG.csv
COL-1,COL-2,COL-3,COL-4
NAME1,11,FALSE,
NAME2,22,FALSE,2017/12/1
NAME3,33,FALSE,2018/1/29
NAME4,44,TRUE,
NAME5,55,TRUE,2017/12/1
NAME6,66,TRUE,2018/1/29

csvなので、各カラムは文字列です

COL-4の出力条件については、

DATE_ST = InputBox("抽出開始日") ←2018/1/1を入れます
DATE_ED = InputBox("抽出終了日") ←2018/2/1を入れます

で取得しております


Dim i, reccount As Long
reccount= Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To reccount
If Cells(i, 3) = False Then
Rows(i).Copy newshhets.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
End If
Next i

とFALSE条件側(1.)のみは書いたのですが、
TRUE側の条件(2.)を追加して記載する場合、どのように記載すればよいのでしょうか?
(COL-3が「TRUE」で、期間が「DATE_ST〜DATE_ED」です)

お分かりになられる方、申し訳ございませんが、よろしくお願いいたします
・ツリー全体表示

【79620】Re:指定期間でログインしたユーザーを知...
お礼  amatsuno  - 18/2/15(木) 13:36 -

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

上記の方法で達成できました。

変数名は修正いたします。

件数については、
おそらくmaster側が10000件程度で、
daily側が6000件程度になりそうなので、
考慮の価値がありそうです
・ツリー全体表示

【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 と表記されました。
そのほかの時間も問題なく表記されます。 

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

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