Excel VBA質問箱 IV

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

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


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

【79181】Re:VBA Stepの数値変えるとループしない
発言  マナ  - 17/5/31(水) 18:45 -

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

>これのStepを2〜9にする

この意味は、

For i = 1 To 9 Step 9

ということですか???
・ツリー全体表示

【79180】Re:範囲が座標から指定しないタイプの選...
発言  マナ  - 17/5/31(水) 18:42 -

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

こういうことですか

Selection.BorderAround Weight:=xlThin

とか

Activecell.Resize(3, 3).BorderAround Weight:=xlThin
・ツリー全体表示

【79179】Re:2016VBAのSORTで10004のエラー
発言  マナ  - 17/5/31(水) 18:32 -

引用なし
パスワード
   ▼初心者ですいません さん:

>2003のままのSORTメソッドで今回なエラーとなり、2013のSORTオブジェクトに変更している最中です。

今まで使用していた2003のコードを提示できませんか。
本当に、それが2013(タイトルは2016?)でエラーになるのですか。
・ツリー全体表示

【79178】Re:VBA Stepの数値変えるとループしない
発言  カリーニン  - 17/5/31(水) 16:40 -

引用なし
パスワード
   もし
Step 2-9
と書いているとしたら、それは

Step -7
と同じことになります。
・ツリー全体表示

【79177】Re:VBA Stepの数値変えるとループしない
発言  カリーニン  - 17/5/31(水) 16:38 -

引用なし
パスワード
   ループを2-9ではなく、Stepが2-9ですか?

こういう書き方をした、ということですか?

Sub Boox2()
  Dim i As Integer
  Dim w As Integer
 
  For i = 1 To 9 Step 2-9
    w = w + i
    Cells(i, 2) = w
  Next 
End Sub

※wの初期値が指定されてませんが、それは大丈夫ですか?
・ツリー全体表示

【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("金額")

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

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