Excel VBA質問箱 IV

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

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


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

【79176】VBA Stepの数値変えるとループしない
質問  fggf  - 17/5/31(水) 16:04 -

引用なし
パスワード
   Sub Boox()
  Dim i As Integer
  Dim w As Integer
 
  For i = 1 To 9 Step 2
    w = w + i
    Cells(i, 2) = w
  Next 
End Sub
これのStepを2〜9にするとループしなくなるのはなぜですか?
・ツリー全体表示

【79175】Re:範囲が座標から指定しないタイプの選...
発言  カリーニン  - 17/5/31(水) 13:21 -

引用なし
パスワード
   罫線ではなく枠線ですか?
行高やセル幅ではなくて枠線の位置ですか?

すみません。私には読解力が内容です。他の方の回答をお待ちください。
・ツリー全体表示

【79174】Re:範囲が座標から指定しないタイプの選...
回答  ぉう  - 17/5/31(水) 13:11 -

引用なし
パスワード
   ▼カリーニン さん:
>>それを指定の座標へ入れる形ににたいのですが
>
>これの意味が不明です。
>指定の座標とは?
>入れるとは?

例えば、枠線の範囲(大きさ)を設定し、それからCellsやRangeでその大きさを定めた枠線の位置を指定する。という感じにしたいんです。
・ツリー全体表示

【79173】Re:2016VBAのSORTで10004のエラー
発言  γ  - 17/5/31(水) 12:42 -

引用なし
パスワード
   ▼初心者ですいません さん:
>申し訳ございません。
>実は、前任者が作成したロジックですが、2003から2013へのUPで、
>2003のままのSORTメソッドで今回なエラーとなり、2013のSORTオブジェクトに変更している最中です。
>ただ、いかんせん、詳しいものがおらず、VBAをかじった経験者の私がやらざるを得なくなりました。
>なので、ロジックはよく分からず、手探りで対応している次第。
>さらに、来週頭までに動作させる必要もあります。
>ここで、ご無理であれば、なんとかするしかないです。

型定義部分を含めたコードを正しくコピーペイストすれば、
皆さんからコメントを貰えるはずです。
今の状態で待ち続けるのは、時間の無駄です。

>m(_ _)m
>
>ちなみに、Order前のカンマでない点と、SortFieldaのスペルは間違えています。
・ツリー全体表示

【79172】Re:範囲が座標から指定しないタイプの選...
発言  カリーニン  - 17/5/31(水) 12:07 -

引用なし
パスワード
   >それを指定の座標へ入れる形ににたいのですが

これの意味が不明です。
指定の座標とは?
入れるとは?
・ツリー全体表示

【79171】範囲が座標から指定しないタイプの選択方...
質問  ぉう  - 17/5/31(水) 11:26 -

引用なし
パスワード
   Range(B2:D4).BorderAround Weight:=xlThin
このような記述で
B2:D4の範囲の枠線を同じ大きさで作成し、それを指定の座標へ入れる形ににたいのですが
どうしたらいいんでしょうか?
Range()だと位置をしてしなければならないので・・・
・ツリー全体表示

【79169】Re:2016VBAのSORTで10004のエラー
回答  初心者ですいません  - 17/5/31(水) 10:20 -

引用なし
パスワード
   申し訳ございません。
実は、前任者が作成したロジックですが、2003から2013へのUPで、
2003のままのSORTメソッドで今回なエラーとなり、2013のSORTオブジェクトに変更している最中です。
ただ、いかんせん、詳しいものがおらず、VBAをかじった経験者の私がやらざるを得なくなりました。
なので、ロジックはよく分からず、手探りで対応している次第。
さらに、来週頭までに動作させる必要もあります。
ここで、ご無理であれば、なんとかするしかないです。
m(_ _)m

ちなみに、Order前のカンマでない点と、SortFieldaのスペルは間違えています。
・ツリー全体表示

【79168】Re:2016VBAのSORTで10004のエラー
発言  γ  - 17/5/31(水) 8:15 -

引用なし
パスワード
   > ちなみに、記載したロジックは手書き転載ですので、
> 細かい打鍵ミスはお許しください。

いいえ許せません。
デバッグ(プログラムミスの修正)がテーマなんだから、
現在動作中のコードをそのままこちらにコピーペイストしてください。
少なくともコンパイルエラーの出ないものを提示すべきです。

というのは、
Option Explicitを書いていない場合、
タイプミスして別の変数と解釈されていてうまく動作しない、
などというのは実によくある話です。
その場合は、手打ちのミスなのか、本来のコードが間違っているのか
見分けがつきません。

変数名違いを指摘すると、いやいや実はきちんと書いてありますよ、
などとなって、無駄な時間を回答者は使うわけです。
それに他人に手打ちのミスのチェックまでさせる積もりなんですか?
他人にものを依頼するときのマナーをよく考えるべきです。

ステップ実行して、ソートの対象セルが想定しているものになっているのか、
まずは自分でデバッグをしてください。
その上で不明な点を質問して下さい。
その際、ユーザー定義型があれば、その定義も含めて示さないと。
他人にはあなたのPC画面が見えているわけではないんですよ。

デバッグの方法は、
ht tp://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_030.html
ht tp://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_030_03.html
などのページを参考にして下さい。

# たぶん、自分で考えたコードだけでなく、
# ネット上にあったものを借用しているはず。
# 自分でよく理解できていないんだろうなと想像します。
# (少なくとも今のあなたに不必要な)汎用化が足を引っ張っている印象です。
・ツリー全体表示

【79167】2016VBAのSORTで10004のエラー
質問  初心者ですいません  - 17/5/30(火) 23:23 -

引用なし
パスワード
   EXCEL VBAの実行で、「実行時エラー ’10004’ アプリケーション定義またはオブジェクト定義のエラーです」が出て困っています。
どなたかわかる方教えてください。
エラーの出る場所は、以下のSortのApplyです。
この記述で何かおかしい所があるのでしょうか?
(ちなみに、記載したロジックは手書き転載ですので、細かい打鍵ミスはお許しください。)

【メイン】
Call Z00関数.SelectRows(2)

ActiveSheet.Sort.SortFielda.Clear
ActiveSheet.Sort.SortFielda.Add Key:=ActiveSheet.Range("B2").Order:=xlAscending,DataOption:=xlSortNormal
With ActiveSheet.Sort
.SetRange Selection
.header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

public Function SelectRows(
Optional ByVal ingStartRow As long = 1, _
Optional ByVal ingEndRow As long = 0 _
(
If ingEndRow = 0 then
ingEndRow = Z00関数.GetLastRC(EnmGetLastR.Row)
End if
If ingEndRow < inStartRow then
ingEndRow = Appllication.Rows.count
End if

Call Application.Rows(ingStartRow & ":" & ingEndRow).Select

End Function


public Function GetLastrc, _
ByVal usrRC As enmGetLastRC, _
Optional ByVal strBookName As String = "", _
Optional ByVal strSheetName As String = "" _
(
On Error Go To EXCEPTION
IF strBookName = "" then
strBookName = ActiveWorkbook.Name
End if
IF strSheetName = "" then
strSheetName = Workbooks(strBookName).ActiveSheet.Name
End if
With Workbooks(strBookName).Sheets(strSheetName).UsedRange
if usrRC = unmGetLastRC.Row Then
GetLastRC = .Find("*", ,xlFormulas, ,xlByRows, xlPrevious).row
else
GetLastRC = .Find("*", ,xlFormulas, ,xlByColumns, xlPrevious).Column
End if
End With

Exit Function
EXCEPTION:
GetLastRC = 0
Exit Function
・ツリー全体表示

【79166】Re:2種類の集計方法
発言  マナ  - 17/5/28(日) 15:23 -

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

集計用に配列は別に用意し、
dicにはインデックスを登録でももよいです。
理解しやすいほうをお使いください。

Sub 日時集計2()
  Dim dKey As String
  Dim c As Range
  Dim dic As Object
  Dim v()

  Set dic = CreateObject("Scripting.Dictionary")

  With Sheets("ソート")
    For Each c In .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
      dKey = c.Value & vbTab & c.Offset(, 3).Value
      If Not dic.exists(dKey) Then
        n = dic.Count + 1
        dic(dKey) = n
        ReDim Preserve v(1 To 5, 1 To n)
        v(1, n) = c.Value
        v(2, n) = c.Offset(, 3).Value
        v(3, n) = c.Offset(, 4).Value
      End If
      n = dic(dKey)
      v(4, n) = v(4, n) + c.Offset(, 7).Value
      v(5, n) = v(5, n) + c.Offset(, 9).Value
    Next
  End With
 
  With Worsheets.Add
    .Name = "日時集計"
    .Range("A1").Resize(UBound(v, 2), 5).Value = _
      WorksheetFunction.Transpose(v)
    .Select
  End With

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

【79165】Re:2種類の集計方法
発言  マナ  - 17/5/27(土) 19:54 -

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

dicには、配列も登録できます。
商品別集計も同じ感じでできると思います。

Sub 日時集計()
  Dim dKey As String
  Dim c As Range
  Dim dic As Object
  
  Set dic = CreateObject("Scripting.Dictionary")
 
  With Sheets("ソート")
    For Each c In .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
      dKey = c.Value & vbTab & c.Offset(, 3).Value
      If Not dic.exists(dKey) Then
        dic(dKey) = Array(Empty, Empty, Empty, Empty, Empty)
      End If
      dic(dKey) = Array( _
        c.Value, _
        c.Offset(, 3).Value, _
        c.Offset(, 4).Value, _
        dic(dKey)(3) + c.Offset(, 7).Value, _
        dic(dKey)(4) + c.Offset(, 9).Value)
    Next
  End With
  
  With Worsheets.Add
    .Name = "日時集計"
    .Range("A1").Resize(dic.Count, 5).Value = _
      WorksheetFunction.Transpose(WorksheetFunction.Transpose(dic.items))
    .Select
  End With
 
  Set dic = Nothing
  
End Sub
・ツリー全体表示

【79164】Re:ピボットテーブル自動作成
お礼  yu_ka  - 17/5/27(土) 19:23 -

引用なし
パスワード
   ありがとうございます。
毎回ピボットテーブルを作成しなくてもよい、
なんて、考えが及びませんでした。
勉強になります。
ありがとうございました。

コード実際に使わせていただきました。

ありがとうございます。

▼マナ さん:
>▼yu__ka さん:
>
>修正してみました。
>
>個人的には、ピボットテーブルを毎回作成しなくても
>手作業で作成したものをひな形とし
>マクロでは、
>1.元データの修正
>2.ピボットテーブルの更新
>3.別名で保存
>という運用がよいのではと思います。
>
>Sub ピボットテーブル作成2()
>  Dim DataS As Worksheet 'データシート
>  Dim PivotS As Worksheet 'ピボットテーブルを作成するシート
>  Dim PCache As PivotCache 'ピボットキャッシュ用変数
>  Dim PivotT As PivotTable
>  
>  Set DataS = ThisWorkbook.Worksheets("ソート")
>  
>  '『ソート』シートからピボットキャッシュを作成
>  Set PCache = ActiveWorkbook.PivotCaches.Create( _
>    SourceType:=xlDatabase, _
>    SourceData:=DataS.Range("a1").CurrentRegion)
>  
>  '『集計』シートを追加
>  Set PivotS = Worksheets.Add
>  PivotS.Name = "集計"
>  
>  '『集計』シートにピボットテーブル作成
>  Set PivotT = PCache.CreatePivotTable _
>    (TableDestination:=PivotS.Range("A1"))
>  
>  
>  'ピボットテーブルに行と列フィールドを追加
>  PivotT.AddFields _
>    ColumnFields:="売上日", _
>    RowFields:="品名コード"
>  
>  'ピボットテーブルに値フィールドを追加
>  PivotT.AddDataField( _
>    Field:=PivotT.PivotFields("金額"), _
>    Caption:="合計 / 金額", _
>    Function:=xlSum) _
>    .NumberFormat = "#,##0_ "
>  
>End Sub
・ツリー全体表示

【79163】Re:ピボットテーブル自動作成
発言  マナ  - 17/5/27(土) 16:22 -

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

修正してみました。

個人的には、ピボットテーブルを毎回作成しなくても
手作業で作成したものをひな形とし
マクロでは、
1.元データの修正
2.ピボットテーブルの更新
3.別名で保存
という運用がよいのではと思います。

Sub ピボットテーブル作成2()
  Dim DataS As Worksheet 'データシート
  Dim PivotS As Worksheet 'ピボットテーブルを作成するシート
  Dim PCache As PivotCache 'ピボットキャッシュ用変数
  Dim PivotT As PivotTable
  
  Set DataS = ThisWorkbook.Worksheets("ソート")
  
  '『ソート』シートからピボットキャッシュを作成
  Set PCache = ActiveWorkbook.PivotCaches.Create( _
    SourceType:=xlDatabase, _
    SourceData:=DataS.Range("a1").CurrentRegion)
  
  '『集計』シートを追加
  Set PivotS = Worksheets.Add
  PivotS.Name = "集計"
  
  '『集計』シートにピボットテーブル作成
  Set PivotT = PCache.CreatePivotTable _
    (TableDestination:=PivotS.Range("A1"))
  
  
  'ピボットテーブルに行と列フィールドを追加
  PivotT.AddFields _
    ColumnFields:="売上日", _
    RowFields:="品名コード"
  
  'ピボットテーブルに値フィールドを追加
  PivotT.AddDataField( _
    Field:=PivotT.PivotFields("金額"), _
    Caption:="合計 / 金額", _
    Function:=xlSum) _
    .NumberFormat = "#,##0_ "
  
End Sub
・ツリー全体表示

【79162】Re:ファイルをまたいだ数値の取得および...
発言  γ  - 17/5/27(土) 7:31 -

引用なし
パスワード
   ・各部門のシートはフォーマット(特に数値が入っているセルの位置)が統一されているか。
 部門によっては、製品と製品の間に空行が入っているといったことがないか。
・製品の数は各部門で違うとき、
 単純に、最後の行までを対象に、製品の合計をとればよいのか、不明。
などの疑問点があります。

しかし、現時点で示されたものを前提にコメントしておきます。

> Dim 変数 As Range
> SET 変数 = RANGE を使うのかなと思いましたが、
> 別ファイルからの取得なので、
> SET 変数 = RANGE('[作業内容.XLS]部門A!B2)
というところですが、
Workbooks("aaa").Worksheets("BBB").Range("...") という形式のほうが
よいでしょう。

たとえば、こんな書き方ができるかもしれません。参考例です。
Sub test()
  Dim wbS As Workbook
  Dim wbD As Workbook
  Dim wsS As Worksheet
  Dim wsD As Worksheet
  Dim sh As Variant
  Dim k As Long
    
  Set wbD = Workbooks("単月業績.xls")   'D: Destination(転記先)
  Set wsD = wbD.Worksheets("6月")

  Set wbS = Workbooks("作業内容.xls")   'S: Source(転記元)
  For Each sh In Array("部門A", "部門B")
    Set wsS = wbS.Worksheets(sh)
    wsD.Cells(2 + k, "D").Value = getSum(wsS.Cells(2, 4))
    wsD.Cells(2 + k, "E").Value = getSum(wsS.Cells(3, 4))
    wsD.Cells(3 + k, "D").Value = getSum(wsS.Cells(4, 4))
    wsD.Cells(3 + k, "E").Value = getSum(wsS.Cells(5, 4))
    wsD.Cells(4 + k, "D").Value = getSum(wsS.Cells(6, 4))
    wsD.Cells(4 + k, "E").Value = getSum(wsS.Cells(7, 4))
    k = k + 4
  Next
Ens Sub

合計する部分は、例えば関数にしておいて
Function getSum(r As Range) As Long
  getSum = r.Value + r.Offset(6).Value + r.Offset(12).Value
End Function
などとします。最大3つの製品に関する数値があるという前提です。

上記コードはとっかかりに過ぎません。
月に応じて、書込先の列を変えるとか、いろいろ改善点がありえます。

なお、今後、実はこういう前提になっていました、
という変更事項がありましてもコードを修正する積もりはありません。
予め、お断りしておきます。

上記は単なるヒントですから、
それを参考にしてあなたがトライしていただきたいと思います。

なお、今後、予算と実績の比較とか色々な分析をされると思うので、
現在のフォーマットが適当なものかも不明です。
ピボットテーブルなどの利用できる形式の書式のほうがよいかもしれませんね。

それでは頑張ってください。
・ツリー全体表示

【79161】Re:ピボットテーブル自動作成
発言  マナ  - 17/5/26(金) 18:27 -

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

>With .PivotFields("金額")

ピボットテーブルの指定がどこにもない?
というエラーででしょうか。
・ツリー全体表示

【79160】Re:ファイルをまたいだ数値の取得および...
回答  まぐろ  - 17/5/26(金) 15:06 -

引用なし
パスワード
   ▼γ さん:
>疑問点。
>1.単月業績ファイルでは、部門という切り口はどうなっているのですか?
>2.製品は"あ"と"い"だけですか?それは固定なんですか?
>
>集計は「作業内容」ファイルで計算式で行い、
>その結果を転記する部分だけマクロにするほうが効率がよいかもしれませんね。
>
>なお、表を書くときは、こんな風に書いた方が分かりやすいと思う。
>■「作業内容」ファイルの「部門A」シート(元資料)
>
>(上段;予算 下段;実績)
> A      B    C    D ・・・・・
>1 作業内容   4月  5月  6月 ・・・・・
>2 作図   10,000 11,000 12,000・・・・
>3 (製品あ)  9,000 12,000 10,500・・・・
>4 組立   15,000 14,000 17,000・・・・
>5      13,500 12,000 16,000・・・・
>6 要請対応  5,000  4,200  4,800・・・・
>7       5,100  4,000  4,700・・・・
>8 作図    3,000  2,700  2,800・・・・
>9 (製品い)  2,850  2,750  2,900・・・・


γ様

お返事ありがとうございました。

表の書き方は仰る通りです、自分のは見にくすぎました、すいません。

疑問点1.について

   AU  AV    AW    AX
29 部      予算    実績
30 門  作図  14,800  13,400→製品"あ"と"い"の合算
31 A  組立  17,000  16,000
32   要請対応  4,800   4,700
33 部
34 門
35 B
36 ・
37 ・
38 ・

といったように、「作業内容」ファイルでは、1部門の数値が
1SHEETでまとめられており、各部門のSHEETからそれぞれ1つの月の数値を
取得していき「単月業績」の中で1つのSHEETでまとめる、という形です。

疑問点2.について

固定ではなく、期(半年)ごとで見直しをかけて、変更します。
ついでに、”部門”の数(SHEET)の数も、見直しによって増減することもあります。

VBAだと列を指定して数値を取得するので、変更があってもそれに応じて
取ってくる行の値を変えればいいのかなと思っていました。


>集計は「作業内容」ファイルで計算式で行い、
その結果を転記する部分だけマクロにするほうが効率がよいかもしれませんね。

その場合、「作業内容」に集計用のシートを別途作って、そこでピボットで集計、
それを転記、みたいな流れでしょうか?
・ツリー全体表示

【79159】Re:ファイルをまたいだ数値の取得および...
回答  まぐろ  - 17/5/26(金) 15:03 -

引用なし
パスワード
   ▼カリーニン さん:
>先ずは、手作業でやるならどういう手順になるかを日本語で考えてみましょう。
>後は、考えた手順をコード化するだけです。


カリーニン様

お返事ありがとうございました。

>日本語で考える
どんなコードかを検索する際に、以下のように考えました。

1.「作業内容」ファイルでは、各SHEET(部門A、B、C、D・・・)で、
数値(作業時間)が、作業内容ごとに入力されている。
このSHEETの数値を「単月業績」へ引っ張りたい。
しかし「作業内容」の各SHEETは別ファイルである

2.さらに、「作業内容」の項目と「単月業績」の項目は、
1対1の対応関係になっていない(「作業内容」の項目を集約して
計算しなければならない)

3.「単月業績」の”4月”SHEETを作る際は「作業内容」の部門SHEETの
4月の数値から、「単月業績」の”5月”を作る際は「作業内容」の5月から、
といったように、取得する数値(列)が変わっていく。


1.は、
DIM 変数 AS RANGE
SET 変数 = RANGE を使うのかなと思いましたが、

別ファイルからの取得なので、

SET 変数 = RANGE('[作業内容.XLS]部門A!B2)

としてみましたが、コンパイルエラー、となってしまいました。
1.ができない為2.、3.に進めない状況です。

1つの変数については検索して出てきますが、組み合わせになると
なかなか出てこなくて難しいです。
・ツリー全体表示

【79158】Re:ピボットテーブル自動作成
質問  yu__ka  - 17/5/26(金) 13:55 -

引用なし
パスワード
   ▼とおりすがり さん:
>偶然にも↓と同じようなことをされてますね。
>
>2種類の集計方法
>ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=79149;id=excel
>
>参考にされてください。

どの部分が参考になるのでしょうか?
恐れ入りますが、具体的に教えていただきたいのですが。
リンク先確認してみましたが、理解できておりません。
よろしくお願いいたします。
・ツリー全体表示

【79157】Re:ピボットテーブル自動作成
発言  とおりすがり  - 17/5/26(金) 13:04 -

引用なし
パスワード
   偶然にも↓と同じようなことをされてますね。

2種類の集計方法
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=79149;id=excel

参考にされてください。
・ツリー全体表示

【79156】ピボットテーブル自動作成
質問  yu__ka  - 17/5/26(金) 12:56 -

引用なし
パスワード
   ピボットテーブルを自動作成しようと、
下記の通り記述しました。
しかし、金額フィールドの表示形式のところで、
「参照が不正または不完全です。」
とエラーになります。
どの箇所を修正すれば、データフィールドの金額に桁区切りカンマを
設定できるのでしょうか?
宜しくお願い致します。


'【商品コードごとの売上金額を集計シートにまとめる。】

Sub ピボットテーブル作成()
Dim DataS As Worksheet 'データシート
Dim PivotS As Worksheet 'ピボットテーブルを作成するシート
Dim PCache As PivotCache 'ピボットキャッシュ用変数

Set DataS = ThisWorkbook.Worksheets("ソート")

'『ソート』シートからピボットキャッシュを作成

 Set PCache = ActiveWorkbook.PivotCaches.Create( _
 SourceType:=xlDatabase, _
 SourceData:=DataS.Range("a1").CurrentRegion)

'『集計』シートを追加
Worksheets.Add
ActiveSheet.Name = "集計"
Set PivotS = ThisWorkbook.Worksheets("集計")

'『集計』シートにピボットテーブル作成
PCache.CreatePivotTable _
   TableDestination:=PivotS.Range("A1"), _
   TableName:="商品別売上表"

End Sub

Sub フィールド追加()

Dim PivotS As Worksheet 'ピボットテーブルがあるシート
Set PivotS = ThisWorkbook.Worksheets("集計")

'ピボットテーブルに行と列フィールドを追加
 PivotS.PivotTables("商品別売上表").AddFields ColumnFields:=Array("売上日"), _
 RowFields:=Array("品名コード")
'ピボットテーブルに値フィールドを追加
 PivotS.PivotTables("商品別売上表").AddDataField _
 Field:=PivotS.PivotTables("商品別売上表").PivotFields("金額"), _
 Caption:="合計 / 金額", _
 Function:=xlSum
 
'エラーヶ所↓↓
 With .PivotFields("金額")
 .Orientation = xlDataField
 .Caption = "合計 / 金額"
 .NumberFormat = "#,##0_ "
 End With


End Sub
・ツリー全体表示

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