Excel VBA質問箱 IV

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

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


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

【79807】Re:フォーマットを別シートからのデータ...
発言  よろずや  - 18/4/17(火) 18:51 -

引用なし
パスワード
   >という流れで考えましたが、上手くできませんでした。
それを提示すると回答が付くと思いますよ。
・ツリー全体表示

【79806】Re:変数のあるセル式を作る方法
発言  よろずや  - 18/4/17(火) 18:47 -

引用なし
パスワード
   >表示更新を自動で連発されるようなマクロは重くなってしまうので避けたいです。
でしたら、セル行の1列目を引数に含める必要があります。
・ツリー全体表示

【79805】変数のあるセル式を作る方法
質問  ペーターパン  - 18/4/17(火) 15:47 -

引用なし
パスワード
   下記のような式をセルに入力しても計算結果がセルに出力されるようにする方法はあるのでしょうか?

 1)セル式に入力す式
  =NAGASA(L1-50)

 2)L1の値は入力しているセル行の1列目に入力されたタイプによって以下の通りの値を取る
  タイプA : 500
  タイプB : 400
  タイプC : 300

補足1
できればユーザー定義関数を利用せず直接=L1-50と入力したいのですが、それだとあとで計算結果を編集することができなくなると思い、ユーザー定義関数を使用した形にしました。

補足2
入力した式の結果はユーザー定義関数のようにアクティブにセルに出力される形式としたいです。ただし、表示更新を自動で連発されるようなマクロは重くなってしまうので避けたいです。

稚拙な文章で大変恐縮ですが、何卒ご助力お願い致します。
・ツリー全体表示

【79804】フォーマットを別シートからのデータで埋...
質問  そら  - 18/4/17(火) 13:43 -

引用なし
パスワード
   エクセルのVBAを活用したいのですが、
どのようにしたらよいのか教えてください。

項目が入った入力用フォーマットがあり、
フォーマットの一部分だけ入力されているシートが複数あります。

一部だけ入力されたシートそれぞれから
統合用のフォーマットシート(入力欄はすべて空)を埋めていき、
すべての入力欄欄が埋まったシートを作成したい。

※ページの内容(いずれも同じフォーマット)
統合用シート
1111シート
2222シート
3333シート

統合用シートのA1セルが空欄の場合、1111、2222、3333のシートのいずれかで
A1セルにデータが入っているものがあれば、そのシートのA1のデータを統合用シートのA1にコピー。

という流れで考えましたが、上手くできませんでした。

上記と合わせて、表の中だけをマクロをかけたいので、その方法もご教示いただきたいです。
よろしくお願いいたします。
・ツリー全体表示

【79803】Re:VBA初心者です。ブック間の列コピーを...
お礼  atori  - 18/4/17(火) 10:43 -

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

>1)ブックの存在確認の記述位置を変更しました。
>2)保存先フォルダの記述方法を変更しました。
>www.moug.net/tech/exvba/0060052.html

ありがとうございます!CreateObjectっていう手もあるんですね…

初めは至らぬところばかりでしたが、判りやすいご指導のおかげでマクロの作成だけではなくやっていることを理解するところまで行けました…!
最初に教えてくださったのがマナさんで良かったと思います、、、本当にありがとうございます(#^^#)
・ツリー全体表示

【79802】Re:指定した数を別シートの内容を参照し...
発言  よろずや  - 18/4/16(月) 21:37 -

引用なし
パスワード
   ▼煮詰まった さん:
>画面から指定した数と、データベース上の数の組み合わせ
>を行い。
>
>組み合わせ結果でぴったり一致した数の場合は、最適として
>数量計と数組み合わせの数のパターンを表示
>
>組み合わせ結果でぴったり一致していないが一番近い数の場合は、
>推奨として数量計と数組み合わせの数のパターンを表示

組み合わせと、差分:=ABS(指定した数-数量計)の表を作り、
差分の小さいものから順に並べ替えてみたらどうでしょう。
・ツリー全体表示

【79801】Re:VBA初心者です。ブック間の列コピーを...
発言  マナ  - 18/4/16(月) 20:04 -

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

1)ブックの存在確認の記述位置を変更しました。
2)保存先フォルダの記述方法を変更しました。
www.moug.net/tech/exvba/0060052.html


  Set wsx = ThisWorkbook.Worksheets("Sheet1")
  
  myPath = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\exam\"

  For k = 1 To 999
    myF = myPath & k & ".xlsx"
    If Dir(myF) = "" Then Exit For
    
    Set wb = Workbooks.Open(myF)
    wsx.Columns(k + 1).Value = wb.Worksheets("Sheet1").Columns(2).Value
    wb.Close False

  Next k
・ツリー全体表示

【79800】Re:指定した数を別シートの内容を参照し...
発言  煮詰まった  - 18/4/16(月) 15:33 -

引用なし
パスワード
   ▼よろずや さん:
>▼煮詰まった さん:
>>指定した数を別シートの内容を参照して最適なパターンを求めたい。
>「最適なパターン」の意味不明。

わかりにくくて失礼しました。
補足説明します。

画面から指定した数と、データベース上の数の組み合わせ
を行い。

組み合わせ結果でぴったり一致した数の場合は、最適として
数量計と数組み合わせの数のパターンを表示

組み合わせ結果でぴったり一致していないが一番近い数の場合は、
推奨として数量計と数組み合わせの数のパターンを表示

このようなことが行いたいのですが・・・
・ツリー全体表示

【79799】Re:VBA初心者です。ブック間の列コピーを...
発言  atori  - 18/4/16(月) 11:41 -

引用なし
パスワード
   ▼マナ さん:
>
>wsx.Columns(k + 1).Value = wb.Worksheets("Sheet1").Columns(2).Value
>
>確認してみてください。
>コピー範囲が大きいと、処理速度が落ちるかも知れませんが
>コードが簡潔になるので、わたしはよく使います。

>>エラーメッセージが出たら終了
>
>ではなく、その番号のブックが存在するかをDir関数で確認し
>しなければ、Exit forでループを抜ける
>
>といった感じにします。
>そうすると、今のコードを、ほぼそのまま使えます。
>Dir関数についてはネットで検索してみてください。

>>    Set wsx = ThisWorkbook.Worksheets("Sheet1")
>
>これは、ループの外で、最初に1回実行でよいです。
>わかりますよね。

ありがとうございます!返信遅れて申し訳ありません。
コードが長くなると多分自分でもよくわからなくなって来てしまうので、コピー・ペーストは一行にまとめました!
Dir関数については調べたところ、If文と組み合わせるのがよいかと思ったので下記の通りに組んでみました。Elseをどういった形にするかで迷っていたのですが、消してみても問題なかったのでそのままにしてあります。
wsxはおっしゃる通りでした…!

Sub Exam1()
'
' exam1 Macro
'
  Dim wb As Workbook
  Dim ws As Worksheet
  Dim wsx As Worksheet
  Dim FileNumber As String

  Set wsx = ThisWorkbook.Worksheets("Sheet1")

  For k = 1 To 999

    Set wb = Workbooks.Open("C:\Users\user\Desktop\exam\" & k & ".xlsx")
    wsx.Columns(k + 1).Value = wb.Worksheets("Sheet1").Columns(2).Value
    wb.Close False

    FileNumber = Dir("C:\Users\user\Desktop\exam\" & k + 1 & ".xlsx")
    
  If FileNumber = "" Then
    Exit For
  End If

  Next k

End Sub

今回も4つ分のファイルで行ったのですが、エラーメッセージはありませんでした!
・ツリー全体表示

【79798】Re:縦並びのデータを横並びにしたい
お礼  muco  - 18/4/16(月) 11:35 -

引用なし
パスワード
   ご回答ありがとうございます。
お返事が遅くなり申し訳ございません。
これからコードの勉強を致します。
・ツリー全体表示

【79796】Re:VBA初心者です。ブック間の列コピーを...
発言  マナ  - 18/4/14(土) 13:00 -

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

>    Set wsx = ThisWorkbook.Worksheets("Sheet1")

これは、ループの外で、最初に1回実行でよいです。
わかりますよね。
・ツリー全体表示

【79795】Re:VBA初心者です。ブック間の列コピーを...
発言  マナ  - 18/4/14(土) 10:33 -

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


>「クリップボードに大きな情報があります」のメッセージも出てしまうので、それに関するものも入れてみました。
>
>    wb.Worksheets("Sheet1").Columns(2).Copy
>    wsx.Columns(k + 1).PasteSpecial Paste:=xlValues
>    wb.Application.CutCopyMode = False


その対応で、よいと思います。

貼付け先,Value = コピー元.Value
という構文を使っても、メッセージはでないかもしれません。
こんな感じです。

wsx.Columns(k + 1).Value = wb.Worksheets("Sheet1").Columns(2).Value

確認してみてください。
コピー範囲が大きいと、処理速度が落ちるかも知れませんが
コードが簡潔になるので、わたしはよく使います。

------

>自動的にフォルダ内のブック数を判別する方法もあるんですかね…?

Dir関数やFilesystemobjectを使えばよいと思いますが
余裕がれば検索してみるとよいです。
簡単にサンプルが見つかると思います。
フォルダ内のすべてのブックに同じ処理したいといったマクロでは
どちらかが、使われることが多いです。

ただ、わたしなら、結果が同じであれば、それでいいので
今回は、手抜きして

>ここから、kをある程度大きな数字にして

でよいかと考えます。
ただし、好みかもしれませんが、

>エラーメッセージが出たら終了

ではなく、その番号のブックが存在するかをDir関数で確認し
しなければ、Exit forでループを抜ける

といった感じにします。
そうすると、今のコードを、ほぼそのまま使えます。
Dir関数についてはネットで検索してみてください。
・ツリー全体表示

【79794】Re:縦並びのデータを横並びにしたい
発言  マルチネス  - 18/4/14(土) 8:09 -

引用なし
パスワード
   参考相互リンク

ht tp://www.excel.studio-kazu.jp/kw/20180413111544.html
・ツリー全体表示

【79793】Re:縦並びのデータを横並びにしたい
回答  よろずや  - 18/4/13(金) 17:17 -

引用なし
パスワード
   副作用のないバージョン
Sub Macro3()
Const FirstRow = 1
Const SourceCol = 1
Const TargetRow = 1
Const FirstCol = 4
Dim SourceRow As Long
Dim TargetCol As Long
Dim FoundCell As Range
Dim SearchCol As Long
  TargetCol = FirstCol - 2
  For SourceRow = FirstRow To Cells(Rows.Count, SourceCol).End(xlUp).Row
    ' 地味に探すバージョン
    Set FoundCell = Nothing
    For SearchCol = FirstCol To TargetCol Step 2
      If Cells(TargetRow, SearchCol).Value = Cells(SourceRow, SourceCol).Value Then
        Set FoundCell = Cells(TargetRow, SearchCol + 1)
        Exit For
      End If
    Next SearchCol
    If FoundCell Is Nothing Then
      TargetCol = TargetCol + 2
      ' 2値代入バージョン
      Cells(TargetRow, TargetCol).Resize(1, 2).Value = Cells(SourceRow, SourceCol).Resize(1, 2).Value
    Else
      ' 値加算バージョン
      FoundCell.Value = FoundCell.Value + Cells(SourceRow, SourceCol + 1).Value
    End If
  Next SourceRow
End Sub
・ツリー全体表示

【79792】Re:縦並びのデータを横並びにしたい
回答  よろずや  - 18/4/13(金) 17:13 -

引用なし
パスワード
   まずは、Find、Copy バージョン(副作用あり)
Sub Macro2()
Const FirstRow = 1
Const SourceCol = 1
Const TargetRow = 1
Const FirstCol = 4
Dim SourceRow As Long
Dim TargetCol As Long
Dim FoundCell As Range
  TargetCol = FirstCol - 2
  For SourceRow = FirstRow To Cells(Rows.Count, SourceCol).End(xlUp).Row
    ' Findメソッドバージョン
    Set FoundCell = Range(Cells(TargetRow, FirstCol), Cells(TargetRow, TargetCol)) _
      .Find(What:=Cells(SourceRow, SourceCol).Value, LookIn:=xlValues, LookAt:=xlWhole)
    If FoundCell Is Nothing Then
      TargetCol = TargetCol + 2
      ' Copyバージョン
      Cells(SourceRow, SourceCol).Resize(1, 2).Copy _
        Destination:=Cells(TargetRow, TargetCol).Resize(1, 2)
    Else
      ' Copyバージョン
      Cells(SourceRow, SourceCol + 1).Copy
      FoundCell.Offset(0, 1).PasteSpecial Operation:=xlAdd
      Application.CutCopyMode = False
    End If
  Next SourceRow
End Sub
・ツリー全体表示

【79791】Re:縦並びのデータを横並びにしたい
発言  muco  - 18/4/13(金) 11:57 -

引用なし
パスワード
   >▼よろずや さん:
横並びにするプログラムもできておりません。
そこからご教授いただければと思います。宜しくお願い致します。
・ツリー全体表示

【79790】Re:縦並びのデータを横並びにしたい
発言  よろずや  - 18/4/13(金) 11:45 -

引用なし
パスワード
   ▼muco さん:
>質問です:以下のような縦並びのデータを、横並びで表示をしたいです。
その部分のプログラムはできたのですか?
・ツリー全体表示

【79789】Re:指定した数を別シートの内容を参照し...
発言  よろずや  - 18/4/13(金) 11:42 -

引用なし
パスワード
   ▼煮詰まった さん:
>指定した数を別シートの内容を参照して最適なパターンを求めたい。
「最適なパターン」の意味不明。
・ツリー全体表示

【79788】縦並びのデータを横並びにしたい
質問  muco  - 18/4/13(金) 11:12 -

引用なし
パスワード
   質問です:以下のような縦並びのデータを、横並びで表示をしたいです。
またデータを横並びにする際に、重複する項目は数値を加算して表示したいです。

【元データ】
項目(A列) 数値(B列)
  A     100
 B     200
 C     300
 D     400
 A     500
 C     600
 E     700

  ↓

【計算結果】
(D1セル) (E1セル) (F1セル) (G1セル) (H1セル) (I1セル) (J1セル) (K1セル) (L1セル) (M1セル)
  A    600    B     200    C     900    D     400    E     700

同じ項目があれば数値を足す場合、どのようなマクロを組めば良いのでしょうか?
説明が下手で申し訳ございませんが、どなたかご教授お願い致します。
・ツリー全体表示

【79787】Re:VBA初心者です。ブック間の列コピーを...
発言  atori  - 18/4/13(金) 11:04 -

引用なし
パスワード
   ▼マナ さん:
>▼atori さん:
>
>>wb.Close
>↓
>wb.Close False
>
>としたほうがよいです。
>・保存しないことがわかりやすい
>・保存するかそうかの確認メッセージが出ない
>からです。

確かにメッセージが出ないのは大きいですね…。
「クリップボードに大きな情報があります」のメッセージも出てしまうので、それに関するものも入れてみました。

本当に分かりやすいご説明ありがとうございます!
教えていただいた方法で作ってみたところ、以下のマクロで1~4.xlsxまでは動作しました…!

Sub Exam1()
'
' exam1 Macro
'
  Dim wb As Workbook
  Dim ws As Worksheet
  Dim wsx As Worksheet

  For k = 1 To 4

    Set wb = Workbooks.Open("C:\Users\user\Desktop\Exam\" & k & ".xlsx")
    Set wsx = ThisWorkbook.Worksheets("Sheet1")
    wb.Worksheets("Sheet1").Columns(2).Copy
    wsx.Columns(k + 1).PasteSpecial Paste:=xlValues
    wb.Application.CutCopyMode = False
    wb.Close False

  Next k

End Sub

CutCopyModeの前のApplicationや、後ろの=に関しては一回消してみたのですが、エラーメッセージが出てしまいました。

ここから、kをある程度大きな数字にしてエラーメッセージが出たら終了(つまりフォルダに存在するブックの数に達すれば終わり)という形でも良いのですが、自動的にフォルダ内のブック数を判別する方法もあるんですかね…?
・ツリー全体表示

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