Excel VBA質問箱 IV

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

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


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

【80068】項目毎にシート分割する方法
質問  hitik  - 18/7/20(金) 16:29 -

引用なし
パスワード
   項目毎にシート分割する方法がわからず困っています。

今、A列に日付、B列に曜日、C列に店舗名、D列に品名がそれぞれ書かれているシートがあります(各列1行目には「日付」「曜日」「店舗名」「品名」と書かれています)。シート名は「POS」です。

店舗名はWAIKIKI、ALA_MOANA、ALOHA_TOWER、KAHALAの4種類です。店舗別(営業地別)に4枚のシート(シート名はそれぞれWAIKIKI, ALA_MOANA, ALOHA_TOWER, KAHALAとする)に分割するコードはどうなるでしょうか?よろしくお願いします。
・ツリー全体表示

【80067】Re:FormulaプロパティでVlookup関数とMa...
発言  γ  - 18/7/20(金) 7:37 -

引用なし
パスワード
   D$1の所以外は変わらない固定の文字列なわけですね。
それなら、D$1を変数dから変換してから、
その固定文字列と & を使って連結すればよいわけです。

肝心のD$1部分は、
変数dから
d.Address(True, False)
とすればよいでしょう。
意味は VBAのヘルプでAddressプロパティを確認して下さい。
トライしてみて下さい。
・ツリー全体表示

【80066】Re:FormulaプロパティでVlookup関数とMa...
発言  初心者ママ  - 18/7/20(金) 0:04 -

引用なし
パスワード
   ▼γ さん:
ご返信ありがとうございます。
質問の作法をよく知らず失礼をして申し訳ありませんでした…
ワークシート上に下記関数を複数セルに直接書き込み用意する手間を省く方法はないかというのがそもそものゴールだったのですが、入り口がまず間違えていたのかもしれません…

C2に入力する関数
=IFERROR(VLOOKUP($A1,sheet2!$A2:$1048576,MATCH(sheet1!D$1(※),sheet2!$2:$2,0),FALSE),0)
※この関数をC2から指定の列数だけ右にコピーしていいき、右に1列ずれるごとにMATCH関数の検索値のセルがD1からE1、F1と一緒にずれる
・ツリー全体表示

【80065】Re:FormulaプロパティでVlookup関数とMa...
発言  基本方針  - 18/7/19(木) 7:12 -

引用なし
パスワード
   このサイトの基本方針から

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

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

また、マルチポストを明示的に禁止しているサイトとのマルチポストをしてはいけません。
・ツリー全体表示

【80064】Re:FormulaプロパティでVlookup関数とMa...
発言  γ  - 18/7/19(木) 6:56 -

引用なし
パスワード
   マクロの文法による式をセルに入れても
嬉しくないでしょう。
Rangeだとか言わずに、まずはワークシート上で
動作する式を確定するのが先決です。
(少なくとも)2箇所に質問してもあまり益がない筈。
回答は付きます。
どちらかに絞る方がよいです。
・ツリー全体表示

【80063】Re:FormulaプロパティでVlookup関数とMa...
発言  初心者ママ  - 18/7/19(木) 0:07 -

引用なし
パスワード
   γ さん

さっそくアドバイス頂きありがとうございます!!
ご指摘いただいた2か所修正した結果、無事動作しました。

が、(重ねての質問となり恐縮なのですが)Match関数の部分を値を返すのではなく、関数をそのまま残す方法はないでしょうか?

イメージとしてはマクロ処理結果、セルに
=Iferror(vlookup(検索値、検索範囲、Match(Worksheets(2).Cells(1, k),Worksheets(3).Range("2:2"),0),false),0)
※Kの変数は値を返す

と入って欲しいのですが、Match関数でやろうとすると無理がありますでしょうか。。
別の関数(Countif等でしょうか…)で記載する方法があればアドバイスいただけますと大変助かります。

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

【80062】Re:FormulaプロパティでVlookup関数とMa...
発言  γ  - 18/7/18(水) 6:46 -

引用なし
パスワード
   試してみてはいませんが、
最後のところ
& Match(d, pd, 0)", False), 0)"

& Application.Match(d, pd, 0) & ", False), 0)"
などとすると良いかもしれません。

・& が漏れていること
・ワークシート関数MatchをVBAで使うには、
 WorksheetFunctionかApplicationをつけることが必要。
 (なお、Matchしなかったときの反応が両者は違います。
  前者はエラーが発生してとまります。
  後者は止まりませんが、エラー値を返します。)
・ツリー全体表示

【80061】FormulaプロパティでVlookup関数とMatch...
質問  初心者ママ  - 18/7/18(水) 2:06 -

引用なし
パスワード
   Formulaプロパティで列番号はMatch関数で参照するVlookup関数を入力したいのですが、Match関数に変数を入れているためか上手く作動しません(コンパイルエラーが出る)
修正すべき箇所ご指導お願いできませんか…?
【前提】
2シート目の1行目:Vlookupの列番号の参照値がある
2シート目の4行目:Vlookupを入力する
ピボットシートの2行目:列番号の検索範囲がある
※ただしvba実行時ピボットテーブルにはデータがまだない状態で、列番号をMatch関数で導く事ができるのはformula関数の処理が終わった後

Dim X as long
Dim i As Long
Dim k As Long
Dim d As String
Dim pd As Range
Dim arr As Range

X = 100

For i = 1 To X
  k = Worksheets(1).Range("A1").Value + i
  d = Worksheets(2).Cells(1, k).Value
  Set pd = Worksheets("ピボット").Range("2:2")
  Set arr = Worksheets("ピボット").Range("A4").CurrentRegion.Offset(1, 0)

 Worksheets(2).Cells(4, k).Formula = "=IFERROR(VLookUp(C2, " & arr.Address(External:=True) & "," & Match(d, pd, 0)", False), 0)"
Next i

よろしくお願いしますm(__)m
・ツリー全体表示

【80060】Re:For 〜NExt
お礼  トキノハジメ  - 18/7/16(月) 14:58 -

引用なし
パスワード
   ▼亀マスター さん:
色々ご指摘有難うございます。

結果として、"函W" でうまく動きました。

有難う御座いました。今後とも宜しくお願いいたします。
・ツリー全体表示

【80059】Re:1つのリストから同じブック内に複数明...
お礼  さくらこ  - 18/7/16(月) 13:19 -

引用なし
パスワード
   詳細にご教示いただき、ありがとうございます。
Option Explicitやオートフィルタの使い方など、とても勉強になります!
今回試行錯誤してみて、一歩踏み出せたと思うので、これからも続けて勉強しようと思います。
教えていただいたコードも、しっかり確認して、使えるようにします!
またつまずいた時はアドバイス求めてこちらに質問させてください。
よろしくお願いいたします。
本当にありがとうございました!!
・ツリー全体表示

【80058】Re:For 〜NExt
回答  亀マスター  - 18/7/16(月) 12:17 -

引用なし
パスワード
   何をしたいのかくらい書きましょうよ。
あと、タイトルも意味がわかりません。

とりあえず、このコードは実行以前に記述途中でコンパイルエラーを
指摘されると思いますが、出ませんでした?
Cells(41,j).Value =(函W) Then
のところでIfがないのにThenがあるのが問題です。

あと、Cells(41,j)の値が「函W」のとき・・・というのをやりたいのなら、
函Wを囲むのは()ではなく””です。

InteriorとColorIndexの間も「,」ではなく「.」ですね。
・ツリー全体表示

【80057】For 〜NExt
質問  トキノハジメ  - 18/7/16(月) 12:03 -

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

下記のコードは何処が悪いのか教えてください。

Dim j As Long

For j = 4 To 6
  Cells(41,j).Value =(函W) Then
    If Cells(43,j) <= 66.5 Then Cells(43,j).Interior,ColorIndex = 22
    End If
Next j

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

【80056】Re:1つのリストから同じブック内に複数明...
発言  γ  - 18/7/16(月) 7:33 -

引用なし
パスワード
   フィルタオプションとオートフィルタを使った、私案を参考までに示します。

なお、フィルタオプションを使う関係で、見出しが必須です。
・ListシートのA3,C3,F3,F3,S3には項目見出しを入れます。
・ClientシートのA1,B1,C1にも見出しを、
 それぞれListシートのA3,C3,S3と全く同一のものを記入してください。

Sub 明細シート作成3()
  Dim wsList   As Worksheet
  Dim wsClient  As Worksheet
  Dim wsForm   As Worksheet
  Dim ws     As Worksheet
  
  Dim lastRow   As Long
  Dim myRange   As Range
  Dim myBody   As Range
  Dim r      As Range

  Dim rowsClient As Long
  Dim n      As Long
  Dim txt     As String
  Dim no     As String
  Dim name    As String
  Dim k      As Long

  Set wsList = Worksheets("List")
  Set wsClient = Worksheets("Client")
  Set wsForm = Worksheets("Form")

  'フィルタ範囲の指定
  lastRow = wsList.Cells(wsList.Rows.Count, 1).End(xlUp).Row
  Set myRange = wsList.Range(wsList.Cells(3, "A"), wsList.Cells(lastRow, "S"))
  
  'その本体部分(つまり見出しを除いた部分)
  Set myBody = Intersect(myRange, myRange.Offset(1))

  '重複を除いて抽出
  myRange.AdvancedFilter Action:=xlFilterCopy, _
              CopyToRange:=wsClient.Range("A1:C1"), Unique:=True

  '転記
  rowsClient = wsClient.Cells(wsClient.Rows.Count, 1).End(xlUp).Row
  For n = 2 To rowsClient
    txt = wsClient.Cells(n, 1).Value  '受注No
    no = wsClient.Cells(n, 2).Value   '管理No
    name = wsClient.Cells(n, 3).Value  '注文者氏名

    '管理No 毎のシートを作成
    wsForm.Copy After:=Worksheets(Worksheets.Count)
    Set ws = ActiveSheet
    ws.name = txt

    '固定項目の転記
    ws.Range("B34").Value = txt
    ws.Range("B5").Value = no
    ws.Range("A3").Value = name

    '管理Noを指定して抽出(品目毎データの転記用)
    myRange.AutoFilter Field:=3, Criteria1:=no

    'その転記
    k = 25
    For Each r In myBody.Columns(1).SpecialCells(xlCellTypeVisible)
      ws.Cells(k, 1) = r.Cells(1, 6).Value
      ws.Cells(k, 8) = r.Cells(1, 8).Value
      k = k + 1
    Next
  Next
  myRange.AutoFilter
End Sub

 
・ツリー全体表示

【80055】Re:1つのリストから同じブック内に複数明...
発言  γ  - 18/7/16(月) 7:21 -

引用なし
パスワード
   頑張られましたね。すごいです。
スキルアップになったことと推察いたします。

老婆心ながら、すこし体裁を整えてみました。
参考にしてください。

なお、冒頭にOption Explicitを入れることをお薦めします。
こうすると、未宣言の変数には警告が出されます。
このことによって思わぬミスタイプを防止することができます。
これを付けないばかりにデバッグに相当な時間がかかってしまうことがあります。
(なお、
ツール − オプション − 編集 で
「変数の宣言を強制する」にチェックを入れておけば、
モジュールを作成した時点で、Option Explicitが自動的に挿入されるので、
手間が省けます。
一度だけチェックを入れておけば、以後、気にする必要はありません。)

Option Explicit
Sub 明細シート作成2()
  Dim wsList As Worksheet
  Dim wsClient As Worksheet
  Dim wsForm As Worksheet
  Dim ws As Worksheet
  Dim rowsList As Long, rowsClient As Long
  Dim n As Long
  Dim txt As String, no As String, name As String
  Dim i As Long, k As Long
  
  Set wsList = Worksheets("List")
  Set wsClient = Worksheets("Client")
  Set wsForm = Worksheets("Form")

  wsList.Range("A4:A200").Copy
  wsClient.Range("A1").PasteSpecial Paste:=xlPasteValues

  wsList.Range("C4:C200").Copy
  wsClient.Range("B1").PasteSpecial Paste:=xlPasteValues

  wsList.Range("S4:S200").Copy
  wsClient.Range("C1").PasteSpecial Paste:=xlPasteValues

  Application.CutCopyMode = False

  wsClient.Range("$A$1:$C$197").RemoveDuplicates Columns:=Array(1, 2, 3), Header:=xlNo

  wsList.Select
  Range("A1").Select

  rowsList = wsList.Cells(Rows.Count, 1).End(xlUp).Row
  rowsClient = wsClient.Cells(Rows.Count, 1).End(xlUp).Row

  For n = 1 To rowsClient
    txt = wsClient.Cells(n, 1).Value
    no = wsClient.Cells(n, 2).Value
    name = wsClient.Cells(n, 3).Value
    
    k = 25
    wsForm.Copy After:=wsForm
    Set ws = ActiveSheet
    ws.name = txt
    ws.Range("B34").Value = txt
    ws.Range("B5").Value = no
    ws.Range("A3").Value = name
    For i = 4 To rowsList
      If wsList.Cells(i, 1).Value = txt Then
        wsList.Cells(i, 6).Copy ActiveSheet.Cells(k, 1)
        wsList.Cells(i, 8).Copy ActiveSheet.Cells(k, 8)
        k = k + 1
      End If
    Next i
  Next n
End Sub
・ツリー全体表示

【80054】Re:1つのリストから同じブック内に複数明...
お礼  さくらこ  - 18/7/16(月) 2:20 -

引用なし
パスワード
   アドバイス頂いた方法とは少し違うかもしれませんが、色々なサイト情報を参考に、一旦はなんとか目的の動作をするマクロが作れました。
これまで、VBAは既存のコードの部分修正程度しかしたことがありませんでしたが、こちらのサイトをはじめ、様々な情報がとても参考になりました。
お作法もなっていないめちゃくちゃな記述かもしれませんが、ひとまずこれで使ってみようと思います。
また何か困ったことがあれば、相談させてください。
この度は、ありがとうございました。

----------
Sub 明細シート作成()

wsList.Select
Range("A4:A200").Select
Selection.Copy
wsClient.Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues
wsList.Select
Range("C4:C200").Select
Selection.Copy
wsClient.Select
Range("B1").Select
Selection.PasteSpecial Paste:=xlPasteValues
wsList.Select
Range("S4:S200").Select
Selection.Copy
wsClient.Select
Range("C1").Select
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
ActiveSheet.Range("$A$1:$C$197").RemoveDuplicates Columns:=Array(1, 2, 3), Header:=xlNo
wsList.Select
Range("A1").Select

Dim rowsList As Long, rowsClient As Long
rowsList = wsList.Cells(Rows.Count, 1).End(xlUp).Row
rowsClient = wsClient.Cells(Rows.Count, 1).End(xlUp).Row

Dim n As Long
For n = 1 To rowsClient

  Dim txt As String, no As String, name As String, i As Long, k As Long
  txt = wsClient.Cells(n, 1).Value
  no = wsClient.Cells(n, 2).Value
  name = wsClient.Cells(n, 3).Value
  k = 25
  wsForm.Copy After:=wsForm
  ActiveSheet.name = txt
  ActiveSheet.Range("B34").Value = txt
  ActiveSheet.Range("B5").Value = no
  ActiveSheet.Range("A3").Value = name
   For i = 4 To rowsList
   If wsList.Cells(i, 1).Value = txt Then
   wsList.Cells(i, 6).Copy ActiveSheet.Cells(k, 1)
   wsList.Cells(i, 8).Copy ActiveSheet.Cells(k, 8)
   k = k + 1
   End If
   Next i

Next n

End Sub
----------
・ツリー全体表示

【80053】解決しました
お礼  はろ  - 18/7/15(日) 20:41 -

引用なし
パスワード
   WorksheetFunctionを消して、Application.Index・・・・に修正したらなぜか動きました。
あとは、フィルタの件数が1件のみの時は、その名称をそのまま取得するように追加しました。


▼γ さん:
>随分長い式ですね。
>ご自分でも理解できない複雑さではないですか?
>
>Worksheets("シート名").Range("E2:E" & Rw).SpecialCells(xlCellTypeVisible)
>が何度も出てきます。ここは工夫できそうですね。
>
>例えば
>Set rng = Worksheets("シート名").Range("E2:E" & Rw).SpecialCells(xlCellTypeVisible)
>などとして、rngを使って式を簡素化してみてはどうですか?
>その過程でエラーの原因がわかるのではないですか?
>
># どんなことを実行したいのかの説明もなしにコードだけ出されても、
># 判じ物でもあるまいし。ご自分で解決するよりないと思います。
・ツリー全体表示

【80052】Re:1つのリストから同じブック内に複数明...
お礼  さくらこ  - 18/7/15(日) 15:18 -

引用なし
パスワード
   アドバイスありがとうございます。
(1)については、マクロ記録でできました。
それ以降の処理について、似たようなコードを参考にしようとしているのですが、なかなか難しく、苦戦中です。
でも、やろうとしている順序が間違ってはいなかったようなので、引き続き頑張ります。
・ツリー全体表示

【80051】Re:1つのリストから同じブック内に複数明...
発言  γ  - 18/7/15(日) 14:55 -

引用なし
パスワード
   まずは、他の回答者からの回答をお待ちください。


もしご自身でトライされるのであれば、以下を参考にして下さい。

大ざっぱに要約すると、
(1)重複のない"管理No"の一覧を作成して、
(2)そのひとつひとつの管理Noに対してシートを作成して、
  所定のデータを書き込む
ということかと思います。

それぞれ、こんな方向で考えたらよいのではないでしょうか。
(1)はフィルタオプションを使ってはどうでしょうか。
 「重複レコードを無視」して別の領域にいったん抽出します。
  といっても手作業でやって下さいと言うことではなく、
  そのマクロ記録をとれば、コードが得られるでしょうということです。

(2)は、オートフィルタを使って、"管理No"に該当するデータのみ抽出します。
  抽出したデータをもとに転記をすればよいと思います。
・ツリー全体表示

【80050】Re:1つのリストから同じブック内に複数明...
発言  さくらこ  - 18/7/14(土) 22:58 -

引用なし
パスワード
   すいません、ごもっともです。
知識が乏しすぎて、手も足も出ない状況で、頼ってしまいました…
時間はかかると思いますが、調べて、コードを書いてみます。
不明点があれば、また質問させていただきたいと思います。
よろしくお願いいたします。
・ツリー全体表示

【80049】Re:vbaで複数関数使用し、エラーになりま...
お礼  はろ  - 18/7/14(土) 20:24 -

引用なし
パスワード
   用途を伝えるのを忘れました。
オートフィルタで抽出したデータから最も多いデータ名を取得したいのです。


▼γ さん:
>随分長い式ですね。
>ご自分でも理解できない複雑さではないですか?
>
>Worksheets("シート名").Range("E2:E" & Rw).SpecialCells(xlCellTypeVisible)
>が何度も出てきます。ここは工夫できそうですね。
>
>例えば
>Set rng = Worksheets("シート名").Range("E2:E" & Rw).SpecialCells(xlCellTypeVisible)
>などとして、rngを使って式を簡素化してみてはどうですか?
>その過程でエラーの原因がわかるのではないですか?
>
># どんなことを実行したいのかの説明もなしにコードだけ出されても、
># 判じ物でもあるまいし。ご自分で解決するよりないと思います。
・ツリー全体表示

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