Excel VBA質問箱 IV

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

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


1 / 3676 ページ 前へ→

【79145】Re:VBEの方の行数の表示
お礼  かな  - 17/5/22(月) 11:28 -

引用なし
パスワード
   ▼カリーニン さん:
回答ありがとうございます。
なかなか目的の記事が見つからず、助かりました。
こちらを参考にデフォでも表示できる方法も探したいと思います。
ありがとうございました。
・ツリー全体表示

【79144】Re:VBEの方の行数の表示
発言  カリーニン  - 17/5/22(月) 10:50 -

引用なし
パスワード
   VBE 行番号 表示
でネット検索してみました。

ht tp://www.koikikukan.com/archives/2014/01/30-015555.php

デフォルトで行番号を表示する機能があるかわ調べていません。
・ツリー全体表示

【79143】VBEの方の行数の表示
質問  かな  - 17/5/22(月) 10:13 -

引用なし
パスワード
   VBE上での行数表示をしたいんですが、そのようような機能はありますか?
・ツリー全体表示

【79142】Re:dictionary item 追加されない
お礼  T-K  - 17/5/21(日) 16:49 -

引用なし
パスワード
   T-Kです
再度ご指摘いただき
ありがとうございます。
ご指摘通りのでした
データ書き込まれました
ほんとに感謝いたします。
・ツリー全体表示

【79141】Re:dictionary item 追加されない
発言  γ  - 17/5/21(日) 12:04 -

引用なし
パスワード
   >それをシート2に作ってあるクロス集計表に、書き込む処理
>をなんとかかんがえてみます。
・書込先シートのB列に品名、
 2行目に日付が間違いなくセットされているか、
・日付の形式がシート1と同じかどうか、
がポイントと思う。
今のロジックでいけるはず。
Do your best !
     
・ツリー全体表示

【79140】Re:dictionary item 追加されない
お礼  T-K  - 17/5/21(日) 9:45 -

引用なし
パスワード
   とりあえず登録されていることがわかりました
いろいろとご迷惑おかけしました
また不明な点ありましたら教えていただけたらとおもいます

ありがとうございました
・ツリー全体表示

【79139】Re:dictionary item 追加されない
お礼  T-K  - 17/5/21(日) 9:43 -

引用なし
パスワード
   T-Kです
早い返信ありがとうございます。
ピボットテーブルの件、ありがとうございます。
確認したら、必要な処理ができました。
目から鱗です
ですが、勉強の意味でもVBAでのクロス集計表の作成を目指します。


イミデイトにて表示させて、Itemが登録されているか
教えていただいた通り確認した結果、予定どおり登録されていました。

ありがとうございます。

それをシート2に作ってあるクロス集計表に、書き込む処理
をなんとかかんがえてみます。
ネットでのっていたサンプルをそのまま使っているため、
手直しが少し必要なようです。
教授ありがとうございました。
・ツリー全体表示

【79138】Re:dictionary item 追加されない
発言  γ  - 17/5/21(日) 7:55 -

引用なし
パスワード
   最初にピボットテーブル関連に触れます。
「ピボットテーブル 連続した日」などで検索すると関連記事があります。
日付のグループ化とフィールドの設定で、「データのないアイテムを表示」を
使うと、データの無い日であっても、連続した日が表示されると思います。

さて、デバッグの話。
こうしたことは、ご自分でトライするものです。

>Debug.Print myVal(i, 4)‘この一文をいれて確認しました。
それはD列に値があるかの確認。

ローカルウインドウで表示されたキーを使って、イミディエイトウインドウで、
? dic(そのキー)
とでもすれば、dictionaryの正しさが確認できるでしょう。

dicの内容を表示するところは、
与えたキーが正しいかどうか、「あなた」が確認すべきです。
・ツリー全体表示

【79137】Re:dictionary item 追加されない
質問  T-K  - 17/5/21(日) 7:25 -

引用なし
パスワード
   ローカルのItemがKEYのみ表示はしりませんでした。
Debug[.Printでイミデイトで表示したら、数値がでてきています。
ということは、登録されていると解釈していいのでしょうか?

Debug.Print myVal(i, 4)‘この一文をいれて確認しました。


後シート2のA列にシート1のA列のデータが、B2列〜各列に日付データが入力されています。


値を出して
これとは別のシートの表にコピーしたいのですが、そのシートの表は休日も
ふくまれています
そのためピボットテーブルの場合、データのみをクロス集計するため、
コピーして貼り付ける際手間になります。


シート2に記入したいのですが、現状ですと何も表示されません。
なにが悪いのか 重ねて教えてください。
よろしくお願いします
・ツリー全体表示

【79136】Re:dictionary item 追加されない
発言  γ  - 17/5/21(日) 6:33 -

引用なし
パスワード
   (1)ローカルウインドウの表示の件
Sub test()
  Dim dic As Object
  Set dic = CreateObject("Scripting.Dictionary")
  dic("a") = 1
  dic("b") = 2
  Stop
End Sub
でローカルウインドウに表示されるのは、
"a"や"b"であって、1や2ではありません。
"Item"というのは、コレクション的なものの、各要素といった程度の意味です。
そしてdictionaryの場合はキーの値が表示される決まりです。

(2)
ところで、前半はこんな風にも書けるでしょう。
Sub test51()
  Dim dic As Object
  Dim mat As Variant
  Dim s  As String
  Dim i  As Long
  Dim j  As Long
  Dim sh1 As Worksheet

  Set dic = CreateObject("Scripting.Dictionary")
  Set sh1 = Worksheets("Sheet1")

  ' 元データを配列に格納
  mat = sh1.Range("A1").CurrentRegion.Value

  ' dicへデータを格納
  For i = 1 To UBound(mat, 1)
    s = mat(i, 1) & "_" & mat(i, 3)
    dic(s) = dic(s) + mat(i, 4)
  Next

(3)
このあとに続く部分は、アクティブシートに書き込むということですね?
シートを指定したコードにしたほうが間違いがないですよ。
Sheet1をアクティブにしておくと上書きされかねない。

(4)
また、そのキーの値は、予め判明しているのですか?
そのキーたちを、順序を含めて求めることになると、
むしろピボットテーブルを使ったほうが自然かもしれません。
・ツリー全体表示

【79135】Re:dictionary item 追加されない
発言  γ  - 17/5/21(日) 1:05 -

引用なし
パスワード
   > ローカルで確認するとD列の値が、Itemとして追加されていません。
ローカルウインドウで Itemと書いてあるのは、
別にDictionaryのItemが書かれているのではありません。
むしろDictionaryのkeyに相当するものです。
もっと簡単な例で確認してみてはどうですか?
・ツリー全体表示

【79134】Re:dictionary item 追加されない
発言  カリーニン  - 17/5/21(日) 0:47 -

引用なし
パスワード
   >myDic.Add myVal2, myVal(i, 4)’登録されていない

>myDic(myVal2) = myDic(myVal2) + myVal(i, 4)

↓のようにしたらどうなりますか?

myDic.Add myVal2, myVal(i, 4) * 1’登録されていない

myDic(myVal2) = myDic(myVal2) * 1 + myVal(i, 4) * 1
・ツリー全体表示

【79133】dictionary item 追加されない
質問  T-K  - 17/5/20(土) 23:38 -

引用なし
パスワード
   データより、クロス集計表をVBAで作成しようとしています。
前回もこちらでお世話になりましたが、再度ご教授お願いします。
A列 品名 B列 数字 C列日付 D列 数字のデータが
あります。(データ数不定)それを
A列とC列の値をKeyとして取込み、itemをD列の値で取込み
それをクロス集計表に作成したいとおもっています。
重複している場合はD列の値を追加するながれです。
ネット検索して使えそうなサンプルがあり、少しだけ加工処理してみましたが、
ローカルで確認するとD列の値が、Itemとして追加されていません。
データ型が違うのが原因なのか、インデックスが有効範囲にないだけなのか
原因がわからないためわかるかたがいたらよろしくお願いします。
下記にマクロ記入します

Sub test51()
  Dim myDic As Object, myKey, myItem
  Dim myVal, myVal2
  Dim i As Long, j As Long
  Dim sh1 As Worksheet
    Set myDic = CreateObject("Scripting.Dictionary")
    Set sh1 = Worksheets("Sheet1")
    ' ---元データを配列に格納
    myVal = sh1.Range("A1").CurrentRegion.Value
    ' ---myDicへデータを格納
    For i = 1 To UBound(myVal, 1)
      myVal2 = myVal(i, 1) & "_" & myVal(i, 3)
      If Not myVal2 = "_" Then
        If Not myDic.exists(myVal2) Then
          myDic.Add myVal2, myVal(i, 4)’登録されていない
        Else
          myDic(myVal2) = myDic(myVal2) + myVal(i, 4)
        End If
      End If
    Next
    ' ---Key,Itemの書き出し
    For i = 2 To 1000
      For j = 2 To 1000
        Cells(i, j).Value = myDic(Cells(i, 2).Value & "_" & Cells(2, j).Value)
       
      Next j
    Next i

    Set myDic = Nothing
    Set sh1 = Nothing
End Sub
・ツリー全体表示

【79132】Re:指定セルが変更&空欄でない場合
発言  マナ  - 17/5/19(金) 19:27 -

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

>しかし、空欄(クリア)だった場合はこのプログラムは走らせたくありません。
>(何か文字が入力された場合のみ走らせたい。)

その理由(目的)は、エラーがでるからでしょうか?
だとしたら、それはクリアが問題ではなく
複数セルを同時に変更するからです。
・ツリー全体表示

【79131】Re:指定セルが変更&空欄でない場合
発言  カリーニン  - 17/5/19(金) 17:15 -

引用なし
パスワード
   Target.Value

で判断しては?
・ツリー全体表示

【79130】指定セルが変更&空欄でない場合
質問  カン  - 17/5/19(金) 13:09 -

引用なし
パスワード
   指定セルが変更された場合にその入力文字を小文字に変更したく、
それは、下記プログラムでできました。

Private Sub Worksheet_Change(ByVal Target As Range)
  If Intersect(Target, Range("C2:C5")) Is Nothing Then Exit Sub
  Application.EnableEvents = False
    Target.Value = LCase(Target.Value)
  Application.EnableEvents = True
End Sub

しかし、空欄(クリア)だった場合はこのプログラムは走らせたくありません。
(何か文字が入力された場合のみ走らせたい。)

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

【79129】Re:型が違います
お礼  Ackkn E-MAIL  - 17/5/17(水) 9:59 -

引用なし
パスワード
   ▼Ackkn さん:
>▼カリーニン さん:
>>試しに、セルに
>>
>>="00:15"+"00:32"
>>
>>としてみてください。セルの書式をを時刻形式にしておけば
>>0:47:00
>>と表示されると思います。
>>これは、"00:15"や"00:32"という文字列をエクセルが自動的に時刻データ
>>と判断してシリアル値に変えてくれているからです。
>>
>>逆に、
>>=00:15+00:32
>>とすることは出来ません。シリアル値やセルを参照する場合は直接指定できますが、文字列を
>>指定する場合は""で括る必要があります。
>>
>>シリアル値の一日は「1」
>>シリアル値の一時間は「1/24」
>>シリアル値の一分は「1/(24*60)」
>>になります。
>>
>>ワークシートで8:47を15分で丸める場合です。
>>=FLOOR("8:47","0:15")
>>=FLOOR("8:47",1/(24*4))
>>=FLOOR(0.365972222222222,1/(24*4))
>>
>>セルの場合は、このように入力した「時刻のように見える」数値や文字列を自動的にシリアル値
>>に変換して計算してくれます。
>>VBAでは、ユーザーが命令しないといけません。
>
>カリーニン さん:
>
>ありがとうございます。
>なるほど、分かりました。
>
>そういうことですね。
>早速確認してみます。

カリーニン さん:
マナ さん:

無知な私にお付き合いくださり、ありがとうございました。
無事に動きましたことご報告いたします。
ワークシート関数をVBAで使う場合のシート上での動作と違うこと
を知り、大変勉強になりました。
以下に最終コードを載せておきます。
本当にありがとうございました。

  Set xlAPP = Application
  tm_str = "09:12"
  tm_tmp = TimeValue(tm_str)
  tm_tmp = xlAPP.WorksheetFunction.Floor(tm_tmp, TimeValue("00:15"))
  tm.Value = Format(tm_tmp, "HH:MM")
・ツリー全体表示

【79128】Re:型が違います
発言  Ackkn  - 17/5/17(水) 6:37 -

引用なし
パスワード
   ▼カリーニン さん:
>試しに、セルに
>
>="00:15"+"00:32"
>
>としてみてください。セルの書式をを時刻形式にしておけば
>0:47:00
>と表示されると思います。
>これは、"00:15"や"00:32"という文字列をエクセルが自動的に時刻データ
>と判断してシリアル値に変えてくれているからです。
>
>逆に、
>=00:15+00:32
>とすることは出来ません。シリアル値やセルを参照する場合は直接指定できますが、文字列を
>指定する場合は""で括る必要があります。
>
>シリアル値の一日は「1」
>シリアル値の一時間は「1/24」
>シリアル値の一分は「1/(24*60)」
>になります。
>
>ワークシートで8:47を15分で丸める場合です。
>=FLOOR("8:47","0:15")
>=FLOOR("8:47",1/(24*4))
>=FLOOR(0.365972222222222,1/(24*4))
>
>セルの場合は、このように入力した「時刻のように見える」数値や文字列を自動的にシリアル値
>に変換して計算してくれます。
>VBAでは、ユーザーが命令しないといけません。

カリーニン さん:

ありがとうございます。
なるほど、分かりました。

そういうことですね。
早速確認してみます。
・ツリー全体表示

【79127】Re:型が違います
発言  カリーニン  - 17/5/17(水) 0:26 -

引用なし
パスワード
   試しに、セルに

="00:15"+"00:32"

としてみてください。セルの書式をを時刻形式にしておけば
0:47:00
と表示されると思います。
これは、"00:15"や"00:32"という文字列をエクセルが自動的に時刻データ
と判断してシリアル値に変えてくれているからです。

逆に、
=00:15+00:32
とすることは出来ません。シリアル値やセルを参照する場合は直接指定できますが、文字列を
指定する場合は""で括る必要があります。

シリアル値の一日は「1」
シリアル値の一時間は「1/24」
シリアル値の一分は「1/(24*60)」
になります。

ワークシートで8:47を15分で丸める場合です。
=FLOOR("8:47","0:15")
=FLOOR("8:47",1/(24*4))
=FLOOR(0.365972222222222,1/(24*4))

セルの場合は、このように入力した「時刻のように見える」数値や文字列を自動的にシリアル値
に変換して計算してくれます。
VBAでは、ユーザーが命令しないといけません。
・ツリー全体表示

【79126】Re:型が違います
発言  Ackkn  - 17/5/17(水) 0:05 -

引用なし
パスワード
   ▼カリーニン さん:
>"00:15"
>は文字列ですよね?

カリーニン さん:

そうです。
・ツリー全体表示

1 / 3676 ページ 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free