Excel VBA質問箱 IV

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

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


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

【76266】Excel VBA ODBを使った時のinsertについて
質問  ゆうぞう  - 14/10/22(水) 18:39 -

引用なし
パスワード
   現在Excel VBAでータ登録・更新・参照を行うフォームを作っています。
データはDBは使わず、Excel内の1シートに記載されています。
フォームから登録する際には、"Microsoft.Jet.OLEDB.4.0"を使用してSQL文を実行しています。

[DBオープン関数]
Public Sub OpenDB()

  Dim DBName As String
  DBName = ThisWorkbook.name

  ' Connection生成
  Set dbCon = New ADODB.Connection
  With dbCon
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .Properties(cnsExtProp) = "Excel 8.0"
    .Open ThisWorkbook.Path & "\" & DBName
  End With
End Sub

[SQL実行関数]
Public Sub ExecuteSQL(ByVal sql As String)
  dbCon.Execute (sql)
End Sub

◎質問事項
上記関数を使って1件Insert文でレコードを追加した際、データ最終行+1ではなく、かなり下のほうにレコードが追加される場合があります。
現在は、追加後にソートをして事なきを得ていますが、なぜこのようなことが起きるのでしょうか?
ご存知の方がいれば教えてください。
#可能であればソートはしたくないので。
・ツリー全体表示

【76265】Re:複数のブックの中の特定セルを別ブッ...
質問  Banyan  - 14/10/22(水) 17:14 -

引用なし
パスワード
   質問追加です。
全顧客の特定セルを別のブックに集計すると書きましたが、それだけだと、全ての顧客の数値を合計したいという内容に聞こえてしまいますね。

そうではなく、
顧客別に特定の数値について、月ごと、年ごと、プラン等にはフィルターをかけて顧客の数値を比較できるワークシートであってほしいのです。

上書きではなく毎回新しく出力するので、
まずは、どこかでひな形をつくって各顧客のブックをつくりその中に月ごとのワークシートが増えていくブックじゃないと集計ブックに数式は反映されないのでしょうか?

わかりにくい質問で申し訳ありません。
・ツリー全体表示

【76264】Re:セルダブルクリック 複数マクロ
お礼  コーヒー  - 14/10/22(水) 16:44 -

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

ご丁寧に応用例までご教授いただき、ありがとうございました!
色々と勉強になります。


>▼コーヒー さん:
>Exit Sub
>はそこでマクロを抜ける命令です。
>
>なので今のままでは
>>If Intersect(Target, Range("A2:A10000")) Is Nothing Then Exit Sub
>で、TargetがA2:A10000以外の場合、そこでマクロを抜けてしまってマクロを終了することになります。
>
>回避策としてはいくつかありますがたとえば
>
>Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
>
>  If Not Intersect(Target, Range("A2:A10000")) Is Nothing Then
> 
>    If Target.Value = "" Then
>      Target.Value = Date
>      Cancel = True
>    End If
>  ElseIf Not Intersect(Target, Range("H2:H10000")) Is Nothing Then
>    If Target.Value = "" Then
>      Target.Value = "●"
>      Cancel = True
>    End If
>  End If
>
>End Sub
>
>としてみたり、フラグを追加して
>
>Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
>  Dim CHK_FLG  As Boolean
>  
>  CHK_FLG = True
>  If Intersect(Target, Range("A2:A10000")) Is Nothing Then CHK_FLG = False
>  
>  If CHK_FLG Then
>    If Target.Value = "" Then
>      Target.Value = Date
>      Cancel = True
>    End If
>    Exit Sub
>  End If
>  
>  CHK_FLG = True
>  If Intersect(Target, Range("H2:H10000")) Is Nothing Then CHK_FLG = False
>  
>  If CHK_FLG Then
>    If Target.Value = "" Then
>      Target.Value = "●"
>      Cancel = True
>    End If
>  End If
>
>End Sub
>
>で、どうでしょうか?
>後者の場合は処理の追加に対応しやすいです。
・ツリー全体表示

【76263】Re:セルダブルクリック 複数マクロ
回答  独覚  - 14/10/22(水) 15:52 -

引用なし
パスワード
   ▼コーヒー さん:
Exit Sub
はそこでマクロを抜ける命令です。

なので今のままでは
>If Intersect(Target, Range("A2:A10000")) Is Nothing Then Exit Sub
で、TargetがA2:A10000以外の場合、そこでマクロを抜けてしまってマクロを終了することになります。

回避策としてはいくつかありますがたとえば

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

  If Not Intersect(Target, Range("A2:A10000")) Is Nothing Then
 
    If Target.Value = "" Then
      Target.Value = Date
      Cancel = True
    End If
  ElseIf Not Intersect(Target, Range("H2:H10000")) Is Nothing Then
    If Target.Value = "" Then
      Target.Value = "●"
      Cancel = True
    End If
  End If

End Sub

としてみたり、フラグを追加して

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Dim CHK_FLG  As Boolean
  
  CHK_FLG = True
  If Intersect(Target, Range("A2:A10000")) Is Nothing Then CHK_FLG = False
  
  If CHK_FLG Then
    If Target.Value = "" Then
      Target.Value = Date
      Cancel = True
    End If
    Exit Sub
  End If
  
  CHK_FLG = True
  If Intersect(Target, Range("H2:H10000")) Is Nothing Then CHK_FLG = False
  
  If CHK_FLG Then
    If Target.Value = "" Then
      Target.Value = "●"
      Cancel = True
    End If
  End If

End Sub

で、どうでしょうか?
後者の場合は処理の追加に対応しやすいです。
・ツリー全体表示

【76262】セルダブルクリック 複数マクロ
発言  コーヒー  - 14/10/22(水) 15:19 -

引用なし
パスワード
   はじめまして。
A列空白セルをダブルクリックしたら、「今日の日付」、H列空白セルをダブルクリックしたら「●」が入るようにしたいです。A列の場合は上手くいくのですが、H列には何も反映がされません。調べてみましたが、分からず質問させていただきました。

ご教授をお願いいたします。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)


If Intersect(Target, Range("A2:A10000")) Is Nothing Then Exit Sub

 
If ActiveCell = "" Then
ActiveCell = Date
Cancel = True
End If

If Intersect(Target, Range("H2:H10000")) Is Nothing Then Exit Sub

 
If ActiveCell = "" Then
ActiveCell = "●"
Cancel = True
End If


End Sub
・ツリー全体表示

【76261】Re:複数のブックの中の特定セルを別ブッ...
発言  マルチーズ  - 14/10/22(水) 14:17 -

引用なし
パスワード
   このサイトの基本方針です。

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

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

ht tp://www.excel.studio-kazu.jp/kw/20141022134826.html?t=140116
・ツリー全体表示

【76260】複数のブックの中の特定セルを別ブックに...
質問  Banyan  - 14/10/22(水) 13:22 -

引用なし
パスワード
   毎月顧客ごとの月報データを、専用システムから抽出しエクセル形式に自動的に変換し出力するのですが、そのブックを毎月新しく出力し、過去のデータは一度出力したら削除します。

その顧客ごとの月報データの中のいくつかのセルの値を、
別に全顧客の集計用ブックを作成し、集計させたいのです。

理想は月報用フォルダを作成し、その中に毎月、全顧客の月報を保存したら自動的に、必要な部分だけ自動的に毎月集計用ブックに集計されることです。


懸念していることは、毎月新しいワークシートなので、何かワンクッションがないとできないのではないかということです。

私はまだ初心者なので、マクロ、ピボットテーブル、VBAの操作方法が解りません。どれが一番適切なのかも判断が難しいです。
よろしければご指南の程、よろしくお願い致します。

より質問がわかりやすくなるように画像URLをはりたかったのですが、はれませんでした。
・ツリー全体表示

【76259】タスクに残る
質問  shirouto  - 14/10/22(水) 11:47 -

引用なし
パスワード
   Sub 変更無閉()
With Application
 .DisplayAlerts = False
 .Quit
End With
End Sub

上記のコード実行したら

excel2000→OK問題無

excel2013→windows7のタスクに

excel.exe*32が必ず残ってしまいます。
タスクでプロセスの終了を押さずにどうにかしたいです。

windows7 pro 64bit
excel2013 32bit
・ツリー全体表示

【76258】Re:遅くなりました!m(__)m再質問(確認...
発言  hamako  - 14/10/22(水) 11:16 -

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

すみません。
イベントプロシージャにはコードが入っています。
エクセルファイルにはシートを4つあるのですが、
Sheet2のWorkSheet-BeforeDoubleClickのところ?と
This workBookのGeneralところ?にそれぞれ。。
これが原因ですか???


ちなみに以前頂いたコードの時間を1分としてみたり、
今回頂いたコードでやってみたのですが、
結果(表示される画面)は一緒でした。
エクセル2010です。
・ツリー全体表示

【76257】Re:動的checkbox
お礼  hello help  - 14/10/22(水) 10:25 -

引用なし
パスワード
   なるほど。
数々の指摘ありがとうございます。

勉強になりました。

▼とおりすがり さん:
>まず一点目
>モジュールレベルのcbox(class_chikan型)と
>プロシージャレベルのcbox(msforms.checkbox型)が
>ある為に、set cbox = new class_chikan01は型が合わない
>どちらかの変数名を変更する
>
>二点目
>
>Private Sub mych_change()
> Call MyCaller.cx
>End Sub
>
>MyCallerとはこの場合UserFormだけど、呼び出すプロシージャは公開してな
>ければ呼び出せないので
>
>×Private sub cx()
>○Public sub cx()
>に変更する
>
>あと小言
>見やすくと思って------------------を入れたと思うけど
>コピペしたら消すの面倒くさい。。
>試す人の事を思い、貼り付ければすぐ動くコードでお願いね
>最低限コンパイル済みのコードを貼り付けるようにね
・ツリー全体表示

【76256】Re:動的checkbox
回答  とおりすがり  - 14/10/21(火) 22:39 -

引用なし
パスワード
   まず一点目
モジュールレベルのcbox(class_chikan型)と
プロシージャレベルのcbox(msforms.checkbox型)が
ある為に、set cbox = new class_chikan01は型が合わない
どちらかの変数名を変更する

二点目

Private Sub mych_change()
 Call MyCaller.cx
End Sub

MyCallerとはこの場合UserFormだけど、呼び出すプロシージャは公開してな
ければ呼び出せないので

×Private sub cx()
○Public sub cx()
に変更する

あと小言
見やすくと思って------------------を入れたと思うけど
コピペしたら消すの面倒くさい。。
試す人の事を思い、貼り付ければすぐ動くコードでお願いね
最低限コンパイル済みのコードを貼り付けるようにね
・ツリー全体表示

【76255】Re:遅くなりました!m(__)m再質問(確認...
発言  γ  - 14/10/21(火) 21:54 -

引用なし
パスワード
   独覚 さん、フォローありがとうございました。

変ですねえ。
以下のコードを標準モジュールに置いて、
ボタンにtestを登録して、実行してみてください。

Sub test()
  Application.OnTime Now, "my_Procedure"
  ThisWorkbook.Close False
End Sub

Sub my_Procedure()
  Workbooks.Open ThisWorkbook.FullName
End Sub

同じかなあ。
私の2010では上記で正常動作するんですがねえ。
待ち時間を長くしていってみて下さい。

イベントプロシージャに何か書いてあるということはないですね?
・ツリー全体表示

【76254】Re:遅くなりました!m(__)m再質問(確認...
発言  hamako  - 14/10/21(火) 16:42 -

引用なし
パスワード
   【「test」を実行(ボタンをクリック)するとブックを保存せずに
閉じ、一秒後に「my_Procedure」を実行してブックを開きなおすもの】

・・・という解説、ありがとうございますm(__)m
ぼやっと、こうかな、と思っていたものがはっきりしました!
(皆様、お手数おかけしてすみません)

2秒、3秒、4秒、5秒まで試したのですが、
やはり、「2重に開いていますが開きますか?」と出ます。
その後、「はい」でぬければ、いいことなのですが、
色んな人が今後使う書式なので、メッセージが表示されないのがベストなのです。

図形作成でボタンを作成し、右クリックで「マクロの登録」で
testを選んでいるので
my_Procedureを直接実行?はしてないと思います。
・ツリー全体表示

【76253】Re:遅くなりました!m(__)m再質問(確認...
発言  独覚  - 14/10/21(火) 13:30 -

引用なし
パスワード
   ▼hamako さん:
どのように実行していますか?

γさんのマクロはボタンに登録した「test」を実行(ボタンをクリック)するとブックを保存せずに
閉じ、一秒後に「my_Procedure」を実行してブックを開きなおすものです。
「my_Procedure」を直接実行しているということはないですか?

もし、「test」の実行でそのようなメッセージが出ているのであれば
>  Application.OnTime Now + TimeValue("00:00:01"), "my_Procedure"
の「TimeValue("00:00:01")」部分を「TimeValue("00:00:02")」と大きくしてみてはどうでしょうか?

なお、パス名部分はブック名も含めてください。
・ツリー全体表示

【76252】遅くなりました!m(__)m再質問(確認)で...
質問  hamako  - 14/10/21(火) 13:13 -

引用なし
パスワード
   γ様
テンプレート案がよく理解できず、γ様に教えて頂いた案を試してみました。

確認ですが、
「ファイルのパス名をいれる」の部分は
エクセルファイル名(=売上伝票.xlsです)
までいれますか?

・・・いれてもいれなくてもできるのですが、

いれた場合
→売上伝票.xlsは既に開いています。2重に開くと変更内容破棄されます。
開きますか?という画面がです。

いれない場合
→売上伝票.xlsにアクセスできません。読み取り専用または暗号化されてます。

と出ます。いずれも戻るには戻ってます。
やはりファイル名までいれるのが正解ですか?

それとも何か根本的に間違ってます?か?

マクロの中で
「ファイルのパス名を入れる」というところ以外は
一切いじってないのですが、あってますか?


早々にご返信頂いていたのに時間がたってしまっていてすみません。
また、ばかな質問でしたら、申し訳ないです。
マクロの理解ができなくて、いろいろいじって
ここまでいきついたのですが・・・
・ツリー全体表示

【76251】Re:動的checkbox
質問  hello help  - 14/10/21(火) 12:00 -

引用なし
パスワード
   'userform
----------------------------------------------------------------------------------
Private ufbt() As class_chikan01
Private cbox As class_chikan01

Private Sub UserForm_Initialize()

Dim ctl As MSForms.CommandButton
Dim lmoji_3 As MSForms.Label
Dim cbox As MSForms.CheckBox
Dim i as long
Dim J1(41)

J1(0) = "temp0"
  ↑ 
  '実際のコードは41個分ずらずらと配列が続く
  ↓
J1(41)="temp41"

ReDim ufbt(41)

  For i = 0 To 41
    Set ctl = Controls.add("Forms.CommandButton.1", "button" & i)

   Set ufbt(i) = New class_chikan01
   With ufbt(i)
     .Item = Me.Controls("button" & i)
     .Index = i
     .caller = Me
   End With
    
  Next i

Set cbox = Controls.add("Forms.CheckBox.1", "MyCheckBox01")
   cbox.Caption = "selection"
   
   Set cbox = New class_chikan01
   With cbox
     .Item2 = Controls("MyCheckBox01")
     .caller = Me
   End With

 Set lmoji_3 = Controls.add("Forms.Label.1", "Label_3")
  lmoji_3.Caption = "copyright"
  

Set ctl = Nothing
Set lmoji_3 = Nothing

----------------------------------------------------------------------------------
Private Sub cx()
  MsgBox "ok"
End Sub

----------------------------------------------------------------------------------
Public Sub toch(ByVal Index As Integer)

Select Case Index
case 1
  call ABC
case 2
  call DE
end select


----------------------------------------------------------------------------------
Private Sub UserForm_Terminate()
  Erase ufbt
  Erase cbox
End Sub


'class_chikan01
--------------------'class_chikan01--------------------------------------------
Option Explicit
Private WithEvents mybt As MSForms.CommandButton
Private WithEvents mych As MSForms.CheckBox
Private MyIndex As Integer
Private MyCaller As Object

Public Property Let Item(NewCtrl As MSForms.CommandButton)
  Set mybt = NewCtrl
End Property
----------------------------------------------------------------------------------
Public Property Let Index(NewIndex As Integer)
  MyIndex = NewIndex
End Property
----------------------------------------------------------------------------------
Public Property Let caller(newcaller As Object)
  Set MyCaller = newcaller
End Property
----------------------------------------------------------------------------------
Private Sub mybt_click()
 Call MyCaller.toch(MyIndex)
End Sub
----------------------------------------------------------------------------------
'checkbox用
Public Property Let Item2(NewCtrl As MSForms.CheckBox)
  Set mych = NewCtrl
End Property
----------------------------------------------------------------------------------
Private Sub mych_change()
 Call MyCaller.cx
End Sub
----------------------------------------------------------------------------------

checkboxのみうまく動かない。
なぜ?

checkboxが変わった時にメッセージを出したいのでが。
・ツリー全体表示

【76250】Re:データを一列に並べるマクロ
質問  akiko☆  - 14/10/21(火) 9:40 -

引用なし
パスワード
   γさま、早速にご回答ありがとうございます!

▼γ さん:
>配列を使ってはどうですか?
>
>Dim a(1 To 30000, 1 To 1) As Variant
>というように少し大きめの配列を用意しておいて、
>その配列に書き込んでいきます。
>そして、いくつ書き込んだかもカウントしておきます。
>
>最後に
>Range("A1").Resize(カウント, 1) = a
>とすれば、必要な箇所だけがシートに書き込めます。

ありがとうございます。
本当に申し訳ないのですが、具体的にどこに
どのように教えていただいたのを入れ込めば
よろしいでしょうか。。

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

【76249】Re:選択範囲をPDFで保存
発言  独覚  - 14/10/21(火) 9:18 -

引用なし
パスワード
   ▼γ さん:
Excel2010なので
・A1:AJ60を選択
・ファイルタブから「名前を付けて保存」を選択
・「ファイルの種類」に「PDF(*.pdf)」を選択
・「オプション」で「発行対象」に「選択した部分」を選択
・ほかに設定するオプションはあればそれを選択して「保存」

上記をマクロ記録、じゃないかな?
・ツリー全体表示

【76248】Re:プログレスバーの使用について
お礼    - 14/10/21(火) 7:56 -

引用なし
パスワード
   カリーニン 様
色々お調お調頂き有難うございました。
・ツリー全体表示

【76247】Re:選択範囲をPDFで保存
発言  γ  - 14/10/20(月) 21:48 -

引用なし
パスワード
   A1:AJ60を選択した状態で、マクロ記録を開始して、
・印刷範囲設定
・PDFファイルに印刷
といった動作をマクロ記録してみてはどうでしょうか。
参考になるコードが得られると思います。
・ツリー全体表示

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