Excel VBA質問箱 IV

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

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


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

【76531】Re:コードを短くしたい
発言  β  - 14/12/27(土) 12:34 -

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

最初に提示いただいたコードを良く読んでいませんでした。
私がアップしたコードでは、、元ブックからの抽出がA1,A2,A3,A4・・・
としていましたが、そうじゃなかったんですね。

実行時に選択されていたセルの行の A●,B●,C●,D●,・・・・
なんですね。

この理解が正しければ、修正したSampleとSample2を再掲しますので
確認願います。
・ツリー全体表示

【76530】Re:コードを短くしたい
発言  ゆーあ  - 14/12/27(土) 11:37 -

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

こんにちはです。
コード作成頂き、誠にありがとうございます。

早速、Sampleの方を試してみました。
元ブックのActiveCellを読んでくる必要がある為、
コードを、
  nSh.Range("B6").Value = dSh.Cells(ActiveCell.Row, 1).Value
に変更しましたが、上手く動作しませんでした。。。

データベースとして使用している元ブックは、
各データを行で一つのグループとして分けており、
フォーム上の↓↑で、行を移動させ、フォーム上に表示させております。
したがって、元ブックのActiveCellがある行のデータを新規ブックに
転記させようと思ったのですが、変更したコードでは駄目でした。

どのように変更(取得)してやればよいのでしょうか?
・ツリー全体表示

【76529】Re:コードを短くしたい
発言  β  - 14/12/26(金) 22:38 -

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

追伸です。
xl2000の環境がないので、
Set nBK = Workbooks.Add(xlWBATWorksheet)
ここがちょっと不安です。(Add と Set を同時にできたかどうか)
不具合があればAddとSetをわけますので連絡願います。
・ツリー全体表示

【76528】Re:コードを短くしたい
発言  β  - 14/12/26(金) 22:33 -

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

それでは、先ほどアップしたSaampleに、追加で書いてもらったコード要件を
カミして再掲。ただし、転記コードは3行しか書いてません。残りの47行は
そちらで追加して完成させてください。

で、これでもいいと思いますが、【コードを整理して短く】した Sample2 も
あわせてアップいます。コードも短くしていますが、5セル1セットの転記、
Sampleのほうではコードも5行(つまりセルに5回書き込み)あるのですが
Sample2では2行(つまりせるにへの書き込み回数は1セット2回)にしています。

まず、Sample を自分のものとして理解したのちに Sample2 に取り組んでください。

Sub Sample()
  '元ブックと元シート
  Dim dBK As Workbook
  Dim dSh As Worksheet
  '転記ブックと転記シート
  Dim nBK As Workbook
  Dim nSh As Worksheet
  
  Set dBK = ThisWorkbook
  Set dSh = dBK.Sheets("Sheet3")
  
  Set nBK = Workbooks.Add(xlWBATWorksheet)
  Set nSh = nBK.Sheets(1)
  nSh.Name = "データ抽出"
  
  Application.ScreenUpdating = False   'セル書き込みに伴う画面再描画の抑止(処理時間の短縮化)
  
  nSh.Range("B6").Value = dSh.Range("A1").Value
  nSh.Range("C6").Value = dSh.Range("A2").Value
  nSh.Range("D6").Value = dSh.Range("A3").Value
  
      '
      '省略 ゆーあさんのほうで、コードを追加して完成させてください
      '
      
End Sub

Sub Sample2()
  Dim i As Long
  Dim j As Long
  '元ブックと元シート
  Dim dBK As Workbook
  Dim dSh As Worksheet
  '転記ブックと転記シート
  Dim nBK As Workbook
  Dim nSh As Worksheet
  
  Set dBK = ThisWorkbook
  Set dSh = dBK.Sheets("Sheet3")
  
  Set nBK = Workbooks.Add(xlWBATWorksheet)
  Set nSh = nBK.Sheets(1)
  nSh.Name = "データ抽出"
  
  Application.ScreenUpdating = False
  
  j = 6
  For i = 1 To 46 Step 5
    nSh.Cells(j, "B").Resize(, 4).Value = WorksheetFunction.Transpose(dSh.Cells(i, "A").Resize(4).Value)
    nSh.Cells(j, "H").Value = dSh.Cells(i + 4, "A").Value
    j = j + 5
  Next
  
End Sub
・ツリー全体表示

【76527】Re:コードを短くしたい
発言  ゆーあ  - 14/12/26(金) 21:10 -

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

コメントありがとうございます。
ご説明不足で大変申し訳ございませんが、
現状、データベースのブックと新規ブックを下記の用に宣言しており、
流用しようとしましたが、私の力量では無理でした。。。

Dim exiWB As String
Dim NewWB As String
Dim A As Workbook
Dim C As Workbook

Set A = ThisWorkbook
exiWB = ThisWorkbook.Name
Set C = Workbooks.Add(Template:=xlWBATWorksheet)
NewWB = ActiveWorkbook.Name
ActiveWorkbook.Sheets("Sheet1").Name = "データ抽出"
・ツリー全体表示

【76526】Re:コードを短くしたい
発言  β  - 14/12/26(金) 17:54 -

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

コードはよく読んでいませんが、1項目ごとに

・元ブックをActiveにして
・そこの項目をコピーして
・新ブックをアクティブにして
・書き込みセルを選択して
・ペースト

これでは時間がかかるでしょうね。

>データベースファイルのセルセレクトは、順番(1〜50)ですが、
>新規ブックの方は、規則性はあるもののランダムになってます。

これについても、整理してコードを短くすることができますが、その前に
まずは、上記の状態を改善するところから始められてはいかがでしょう。

Sub Sample()
  Dim dBK As Workbook
  Dim nBK As Workbook
  Dim dSh As Worksheet
  Dim nSh As Worksheet
  
  Set dBK = Workbooks("●●●●.xls")
  Set dSh = dBK.Sheets("Sheet3")
  Set nBK = Workbooks("□□□□.xls")
  Set nSh = nBK.Sheets("データ抽出")
  
  Application.ScreenUpdating = False   'セル書き込みに伴う画面再描画の抑止(処理時間の短縮化)
  
  nSh.Range("B6").Value = dSh.Range("A1").Value
  nSh.Range("C6").Value = dSh.Range("A2").Value
  nSh.Range("D6").Value = dSh.Range("A3").Value
  
      '
      '
      '
      
End Sub
・ツリー全体表示

【76525】コードを短くしたい
発言  ゆーあ  - 14/12/26(金) 15:42 -

引用なし
パスワード
   WinXP Excel2000

顧客情報のデータベースとして使用しているファイルがあり、
フォーム上で情報の登録/変更/削除を行っております。

フォーム上に表示されている情報を印刷する時、
印刷ボタン(フォーム上に印刷用コマンドボタンを配置)を押して、
フォーム自体(PrintFormを使用)を印刷しておりました。

しかし、PrintFormでは、印刷設定が出来ず、
また複数人が使用する為、不具合が生じておりましたので、
フォーム表示上の情報を、新規ブックに転記する方法に変更しました。

新規ブックへの転記コード自体は問題無く出来たのでですが、
転記する情報量が多い為か、単純にコードが長い為か、
(どちらもかも)作業完了までかなりの時間を有しております。

転記コードの流れとして、
1.新規ブック立上げ
2.新規ブックに罫線で表を作成
3.新規ブック表に各項目名を入力
4.データベースファイルから新規ブックへ転記
5.新規ブックのフォント等調整変更
をしております。

やっと本題ですが、
4.データベースファイルから新規ブックへの転記
のコードが、現状1つずつコピーして貼り付けるようになってますので、
そのコードを短くできないかと考えております。
下記に抜粋ですが、コードを示しますので。
アドバイス等頂ければ幸いです。宜しくお願い致します。


  Windows(exiWB).Activate  'データベースファイル選択
  Worksheets("Sheet3").Activate 
  Sheets("Sheet3").Cells(ActiveCell.Row, 1).Select
  Selection.Copy
  Windows(NewWB).Activate  '新規ブック選択
  Sheets("データ抽出").Range("B6").Select
  Selection.PasteSpecial Paste:=xlValues
          ・
          ・
          ・
          ・
  Windows(exiWB).Activate
  Worksheets("Sheet3").Activate
  Sheets("Sheet3").Cells(ActiveCell.Row, 50).Select
  Selection.Copy
  Windows(NewWB).Activate
  Sheets("データ抽出").Range("H51").Select
  Selection.PasteSpecial Paste:=xlValues


データベースファイルのセルセレクトは、順番(1〜50)ですが、
新規ブックの方は、規則性はあるもののランダムになってます。
 B6/C6/D6/E6/H6,B11/C11/D11/E11/H11,B16/C16/D16/E16/H16
 B21/C21/D21/E21/H21,B26/C26/D26/E26/H26,B31/C31/D31/E31/H31
 B36/C36/D36/E36/H36,B41/C41/D41/E41/H41,B46/C46/D46/E46/H46
 B51/C51/D51/E51/H51
・ツリー全体表示

【76524】Re:他PCのEXCEL VBによるイベントビュー...
回答  γ  - 14/12/24(水) 21:27 -

引用なし
パスワード
   > 「evtファイル csv変換」でGoogle検索
の記事の中にもそのコマンドの話が載っていますから、
早晩行き着くと思っておりました。

Logparser.dllは参照設定で少し戸惑うでしょう。
インストールしたフォルダにある
chmヘルプにすべて書いてあります。

開始日時、終了日時の指定、項目の限定など、
細かいことをするのであれば、
結局は、クエリーファイルを外出しする方法が一番簡便な気がします。
それでは。
・ツリー全体表示

【76523】Re:他PCのEXCEL VBによるイベントビュー...
お礼  K2R  - 14/12/24(水) 21:11 -

引用なし
パスワード
   やっとこさできました。

XPで保存したEVTファイルを自分のWindows7環境で試していましたがどうしてもファイルを読み込まないので怒られるので調べてみたところ、EVTをEVTXに変換しないとダメ、とのことでした。
変換するコマンドを入れて下記のバッチファイルで行けました。
とりあえずマクロで動かすのにLogparser.exeとこれでいくか、Logparser.dllを登録してVBスクリプト使用するかいろいろ試してみたいと思います。

いろいろとアドバイス本当にありがとうございました!

(BATファイル内容)
wevtutil epl d:\log\AppEvent.evt d:\log\AppEvent_new.evtx /lf:true

C:\"Program Files\Log Parser 2.2\LogParser" -i:EVT -o:csv "SELECT TimeGenerated, EventID FROM D:\log\*.evt" > d:\log\a.csv
・ツリー全体表示

【76522】Re:他PCのEXCEL VBによるイベントビュー...
発言  γ  - 14/12/22(月) 21:45 -

引用なし
パスワード
   それらのログファイル(6005,6006なら application ではなく、system のほうだと思うが)を
ひとつのフォルダに入れ、
cmdプロンプトを立ち上げて、そのフォルダに移動し、

LogParser -i:EVT -o:CSV "Select * From *.evt Where EventID= '6005' OR EventID = '6006' " > logfile.csv
とすれば、ひとつのファイルに全員の結果が書き込まれるはずです。

(1)LogParserのパスが通ってなければ、フォルダを含んだパス名とする。
  途中にスペースを含む場合は、パス名を""で囲むとよい。
(2)csvファイルのなかに、ファイル名が書き込まれるから、各人の識別は可能。

あとは、Excelの話だから、ピボットテーブルでも何でも使って、
各人別の Login,LogOut時間の一覧を作成すればいい。
・ツリー全体表示

【76521】Re:他PCのEXCEL VBによるイベントビュー...
お礼  K2R  - 14/12/22(月) 20:59 -

引用なし
パスワード
   Log Parcerはトライしてみましたが、こちらWindows7ではなかなか手強く、XPのEVTファイルをうまく読んでくれません。。。
当分時間が空いたらトライしてみます。
回答頂いた皆様、どうもありがとうございました。


▼γ さん:
>こんにちは。
>evtファイルは特殊なフォーマットを持ったバイナリファイルのようですから、
>VBAマクロで読み込むのは難しいように思います。(不可能ではないと思いますが)
>
> 「evtファイル csv変換」でGoogle検索すると、
>Log Parserを使った方法が紹介されています。
>これはトライされていますか?
>まだでしたらトライして、結果を教えてください。
>
>こちらはXP環境ではないので、検証できません。
>なお、SQLでEventIDを6005と6006に絞り込んだうえで
>CSVに書き出すと良いと思います。
・ツリー全体表示

【76520】Re:Sheet上のフォームコントロールの認識
発言  kanabun  - 14/12/22(月) 9:04 -

引用なし
パスワード
   すみません m(_ _)m
.Valueの定数がちがってましたね

  With ActiveSheet.CheckBoxes(1)
    If .Value = xlOn Then
      MsgBox "Checkされています"
    Else
      MsgBox "Checkされていません"
      .Value = xlOff
    End If
  End With
・ツリー全体表示

【76519】Re:Sheet上のフォームコントロールの認識
お礼  亜矢  - 14/12/22(月) 9:00 -

引用なし
パスワード
   ▼β さん:
>▼亜矢 さん:
>
>フォームツールのコントロールへのアクセス手法(コード記述)はいろいろありますが一例です。
>コントロール名は、コントロールを右クリックしてシート左上の名前ボックスに表示されるものを指定します。
>
>なお、値としては -4146 とか 1 といったようになりますが、判定時にはマジックナンバーは使わず、
>エクセル定数のxlOff や xlOn を使うことを推奨します。
>
>Sub Test()
>  MsgBox Sheets("Sheet1").DrawingObjects("チェック 1").Value
>End Sub
ありがとうございました。上記の通りで解決しました。
・ツリー全体表示

【76518】Re:Sheet上のフォームコントロールの認識
発言  β  - 14/12/22(月) 8:41 -

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

フォームツールのコントロールへのアクセス手法(コード記述)はいろいろありますが一例です。
コントロール名は、コントロールを右クリックしてシート左上の名前ボックスに表示されるものを指定します。

なお、値としては -4146 とか 1 といったようになりますが、判定時にはマジックナンバーは使わず、
エクセル定数のxlOff や xlOn を使うことを推奨します。

Sub Test()
  MsgBox Sheets("Sheet1").DrawingObjects("チェック 1").Value
End Sub
・ツリー全体表示

【76517】Re:Sheet上のフォームコントロールの認識
発言  kanabun  - 14/12/22(月) 8:39 -

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

> 下記はActiveXのChekboxの場合ですが、 
>If Workbooks("XXX").Sheets("YYYY").CheckBox1.Value = True Then
> 上と同じ様にフォームコントールのCheckBoxの認識する方法を教えて
>頂きたいと思います。

フォームの CheckBox のばあいは、 CheckBoxesコレクションの何番というかたちで
指定できます。

  With ActiveSheet.CheckBoxes(1)
    If .Value = True Then
      MsgBox "Checkされています"
    Else
      MsgBox "Checkされていません"
    End If
  End With
・ツリー全体表示

【76515】Sheet上のフォームコントロールの認識
質問  亜矢  - 14/12/22(月) 7:17 -

引用なし
パスワード
   よろしくお願いします
12月10日のWindows UpdateによりActiveXが使用不可となりました。
システムの復元で一応使える様にはなりましたが、
シート上にあるActiveXのCheckBoxでなく、できればフォームコントロールの
ChekBoxを使えばいいのかなと思いましたが、VBA上での認識する方法がみつまりませんでした。
 下記はActiveXのChekboxの場合ですが、 
If Workbooks("XXX").Sheets("YYYY").CheckBox1.Value = True Then
 上と同じ様にフォームコントールのCheckBoxの認識する方法を教えて
頂きたいと思います。
・ツリー全体表示

【76514】Re:他PCのEXCEL VBによるイベントビュー...
発言  γ  - 14/12/20(土) 7:58 -

引用なし
パスワード
   こんにちは。
evtファイルは特殊なフォーマットを持ったバイナリファイルのようですから、
VBAマクロで読み込むのは難しいように思います。(不可能ではないと思いますが)

「evtファイル csv変換」でGoogle検索すると、
Log Parserを使った方法が紹介されています。
これはトライされていますか?
まだでしたらトライして、結果を教えてください。

こちらはXP環境ではないので、検証できません。
なお、SQLでEventIDを6005と6006に絞り込んだうえで
CSVに書き出すと良いと思います。
・ツリー全体表示

【76513】Re:他PCのEXCEL VBによるイベントビュー...
発言  K2R  - 14/12/18(木) 23:38 -

引用なし
パスワード
   ▼コマさん さん:
>>「送られてきた他PC(XP)のAppevent.EVTファイルを自PCのエクセルマクロでデータ抽出し、エクセルシートに展開可能か」という内容となります。
>
>XPでしたか・・・。
>すみません、こちらにXP環境がありませんので、これにて失礼します。

もしよろしければそちらの環境下でのコード内容を教えて頂く事は可能でしょうか。
その内容を元にこちらで試してみたいと思うのですが。。。
・ツリー全体表示

【76512】Re:条件付き書式設定について
発言  スレイ  - 14/12/18(木) 21:34 -

引用なし
パスワード
   空白行を避けたいなら

=AND($A4<>"",・・・・・・)

または

=AND(NOT(ISBLANK($A4)),・・・・・・)

もしくは

=ISBLANK($A4)を先行条件として書式変更なしにしては?
・ツリー全体表示

【76511】Re:表示形式
お礼  [名前なし]  - 14/12/18(木) 21:13 -

引用なし
パスワード
   返信遅くなりませいてみません。

なんと説明したらいいのかわかりません。
うまくまとめれたらまた投稿します。

ご迷惑おかけしました。


▼[名前なし] さん:
>お返事ありがとうございます。
>
>エクセルの表記からいらない部分を取り除く
>     ↓
>いる部分は表記のまま。.valueじゃなく見た目のまま
>     ↓
>    textタブ区切り
>     ↓
>    印刷
>
>以上の工程が発生するためです。
>
>selection部分を見た目のまま新規シートにコピーできたらbestです。
>
>* uteigi.Value = Format(uteigi.Value,"#,###")
>  参考にさせて頂きます。
>
> ややこしくて申し訳ありません。
>
>
>▼γ さん:
>>> 14,200にはできないのでしょうか?
>>そういう文字列にしたいということですか?
>>それはなぜですか?
>>実体としては数値で、その表示形式を工夫するという現状では
>>どんなまずい点がありますか?
>>
>>uteigi.Value = uteigi.Text
>>とした段階で、Excelが気を利かせて数値と認識してしまうのですが、
>>どうしてもということなら書式を文字列にしたうえで(マクロ記録で得られます)
>>uteigi.Value = Format(uteigi.Value,"#,###")
>>などとしてはどうですか?
・ツリー全体表示

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