Excel VBA質問箱 IV

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

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


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

【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"
>は文字列ですよね?

カリーニン さん:

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

【79125】Re:型が違います
発言  カリーニン  - 17/5/16(火) 23:51 -

引用なし
パスワード
   "00:15"
は文字列ですよね?
・ツリー全体表示

【79124】Re:型が違います
発言  Ackkn  - 17/5/16(火) 23:41 -

引用なし
パスワード
   ▼カリーニン さん:
>横から失礼します。
>
>エクセル2007で試した限りではTimeValue関数とWorksheetFunction.Floorの組み合わせで
>いけましたけど。
>
>tm_tmp = WorksheetFunction.Floor(TimeValue(tm_str), TimeValue("00:15"))

カリーニン さん:

ありがとうございます。

会社のExcelのバージョンを明日確認して再度テストしてみます。
ただ、違いはFloor関数の中の"00:15"もTimeValueで変換する必要が
ありますか?
Excelシート上でテストした際は、単に"00:15"でいけましたので、
ここだけ違います。
・ツリー全体表示

【79123】Re:型が違います
発言  カリーニン  - 17/5/16(火) 23:23 -

引用なし
パスワード
   横から失礼します。

エクセル2007で試した限りではTimeValue関数とWorksheetFunction.Floorの組み合わせで
いけましたけど。

tm_tmp = WorksheetFunction.Floor(TimeValue(tm_str), TimeValue("00:15"))
・ツリー全体表示

【79122】Re:型が違います
発言  Ackkn  - 17/5/16(火) 22:33 -

引用なし
パスワード
   ▼マナ さん:
>▼Ackkn さん:
>
>>TimeValue関数は、調べましたらWorksheetFunctionでは使えないと
>>ありました。
>>困ったものです。
>
>VBAに同名の関数があります。
>ht tp://www.239-programing.com/excel-vba/func/func036.html

マナ さん

ありがとうございます。
また一つ勉強になりました。

でも、この関数は単に文字列をDate型の値に変換してくれる
だけで、肝心な15分単位での丸めはできません。
この機能にWorksheetFunctionでFloorやCeilingを使いたいのですが、
例の型が違いますで使えないので質問した次第です。
よろしくお願いします。
・ツリー全体表示

【79121】Re:型が違います
発言  マナ  - 17/5/16(火) 20:24 -

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

>TimeValue関数は、調べましたらWorksheetFunctionでは使えないと
>ありました。
>困ったものです。

VBAに同名の関数があります。
ht tp://www.239-programing.com/excel-vba/func/func036.html
・ツリー全体表示

【79120】Re:型が違います
発言  Ackkn E-MAIL  - 17/5/16(火) 19:43 -

引用なし
パスワード
   ▼マナ さん:
>▼Ackkn さん:
>
>>型が違いますでエラーになります。
>
>TimeValue関数を使用したらどうなりますか?

マナさん

TimeValue関数は、調べましたらWorksheetFunctionでは使えないと
ありました。
困ったものです。
・ツリー全体表示

【79119】Re:型が違います
発言  マナ  - 17/5/16(火) 19:16 -

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

>型が違いますでエラーになります。

TimeValue関数を使用したらどうなりますか?
・ツリー全体表示

【79118】型が違います
質問  Ackkn E-MAIL  - 17/5/16(火) 17:35 -

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

Dim tm_tmp As Date
Dim tm_str As String

文字列の時刻をループで15分丸めをしたいのですが、下の
行で、実行時エラー'13' 型が違いますでエラーになります。

tm_str = "09:12"
tm_tmp = WorksheetFunction.Floor(tm_str, "00:15")

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

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