Excel VBA質問箱 IV

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

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


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

【78210】セルの範囲を1行に羅列させる
質問  倒ビン対策  - 16/5/26(木) 11:54 -

引用なし
パスワード
   御世話になります。
特定のフォルダー内にあるファイルの決まった範囲を配列で取り込んで
別ファイルに1行で横へ追記していく動きをさせたく、色々なコードを
参考に作成しましたが、添字mの値が65で【実行時エラー9 インデックスが
有効範囲にありません】と表示され止ってしまいます。
あれこれ1日半ぐらい考えましたが解決する力量が無く
ご助言など頂けますようお願い致します。


Sub 新規レコード転記2()
  Dim SaleAry As Variant
  Dim i As Integer
  Dim j As Integer
  Dim m As Integer
  Dim a As Integer
  Dim b As Integer

Dim SULastRow As Long
Dim DSLastRow As Long
Dim FolderName As String
Dim FileNeme As String

ダイアログ表示:

FolderName = フォルダーダイアログ()

FileNeme = Dir(FolderName & "\*.xls", vbNormal)
 
 If FileNeme = "" Then
  MsgBox "EXCEL ブックがありません"
  
   GoTo ダイアログ表示
   
   End If
   
   Do While FileNeme <> ""
  
   Workbooks.Open (FolderName & "\" & FileNeme)
    With Worksheets(1)
      
  SaleAry = Range("A7:I14").Value
  
    End With
   
  l = 0
  m = 0

  a = UBound(SaleAry)
  b = UBound(SaleAry, 2)
  
  
   With ThisWorkbook.Worksheets("殺菌条件")
  
   DSLastRow = ThisWorkbook.Worksheets("殺菌条件").Range("B65536").End(xlUp).Row
   
     For j = 1 To b
              For i = 1 To a
    
        m = m + 1
       
   .Cells(DSLastRow + 1, m).Value = SaleAry(j, i)

               Next i
         i = 1
     Next j
   
   Set SaleAry = Nothing
  
   
   End With
    
   ActiveWorkbook.Close
   
   FileNeme = Dir()
   
   Loop
   
   ThisWorkbook.Worksheets("殺菌条件").Activate
   
   End Sub
・ツリー全体表示

【78209】Re:エクセル内のデータ転送に関して
質問  TODD  - 16/5/26(木) 10:29 -

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

内容が理解出来ました。
有難うございます。

以上
・ツリー全体表示

【78208】Re:このマクロを1つにまとめたいんですが
お礼  [名前なし]  - 16/5/26(木) 10:10 -

引用なし
パスワード
   説明と回答ありがとうございました。
無事マクロができました。
・ツリー全体表示

【78207】Re:エクセル内のデータ転送に関して
発言  β  - 16/5/26(木) 8:03 -

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

あたらずといえども遠からず?

たとえば 今、 I1:K20 の領域を対象にした処理だとします。

そうすると

With Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Resize(, 3)

これは

With Range("I1:K20") ということになります。

この With で指し示した領域は、その領域が、クリアされようと、何か値が入ろうと
End With まで、動きません。

したがって、.Value = .Value は Range("I1:K20").Value = Range("I1:K20").Value
つまり、その領域全体を値変換しますので、その中の数式部分も値に置き換わるということです。
本来は、式をセットした領域の変換でいいわけですが、面倒なので、式ではなく値が入っている
領域も処理。値が値になるだけで問題はないので。
・ツリー全体表示

【78206】Re:エクセル内のデータ転送に関して
お礼  TODD  - 16/5/26(木) 4:29 -

引用なし
パスワード
   β様

ご説明して頂いた内容により、ほぼ内容を理解することが出来ました。
有難うございます!!


With Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Resize(, 3)
adr1 = .Cells(1).Address(False, True)
.Columns("B:C").Formula = "=IFERROR(VLOOKUP(" & adr1 & "," & adr0 & ",COLUMN(B1),FALSE),""登録なし"")"

------------------------------------------------------------------------
下記最後の行ですが、
.Value = .Value

これは下記内容になると思います。
Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Resize(, 3).Value
= Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Resize(, 3).Value

この行の導入されていなければ、エクセルの対象セルに
IFERROR(VLOOKUP($I5,$A$1:$C$12,COLUMN(C5),FALSE),"登録なし")の式が
記載され、行が導入されると式が記載されません。

I1:K20までのセルにデータを転送した後になるので、
K1:M20までの範囲の値 = K1:M20までの範囲の値となると思います(つまり空欄)。
これがなぜ、式の記載有り、記載無しに影響を与えるのでしょうか?

何度も申し訳御座いません。

以上
・ツリー全体表示

【78205】Re:エクセル内のデータ転送に関して
お礼  TODD  - 16/5/26(木) 1:28 -

引用なし
パスワード
   ご返答有難う御座います。

これから内容を確認させて頂きたいと思います。
たいへん丁寧なご説明、有難う御座います。

以上
・ツリー全体表示

【78204】Re:このマクロを1つにまとめたいんですが
発言  β  - 16/5/25(水) 22:09 -

引用なし
パスワード
   ▼[名前なし] さん:

アップ後、説明文がへんになっていたので削除して、再掲します。

転記対象を2行目からにしていますね。
もし、1行目がタイトル行(すべての列で同じタイトルがない)とすれば
フィルターオプションが使えます。(書式などはコピーされず、値転記になりますが)

Sheet2 の A〜K のタイトルが SHeet1 の B〜L、Aheet2 の O〜Wのタイトルが Sheet1 のM〜U、
Sheet2 の L〜N のタイトルが SHeet1 の V〜X にあるという前提で。

コードが長いので改行していますが、実態は1行のコードで処理可能です。

Sub Sample2()
  Sheets("Sheet2").Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
    CopyToRange:=Sheets("Sheet1").Range("B1:X1"), Unique:=False
End Sub
・ツリー全体表示

【78203】Re:このマクロを1つにまとめたいんですが
発言  β  - 16/5/25(水) 17:59 -

引用なし
パスワード
   ▼[名前なし] さん:

エラーそのものは、たとえばシート上で複数セル領域をいくつか選択して
Ctrl/c とやると、エクセルから叱られますね。
これは仕様です。

それより、むりやり1つのロジックにまとめる必要はさらされないのでは?
たかだか3つのブロックのコピペですから。
ただ、コードの記述を少しすっきりさせたほうがいいですね。

以下は、貼り付け行数、領域によっては、下のほうの空白行部分もコピペされる
『手抜き』ですが
空白のところが空白になるだけなので。

それより現行のコード、

  Range("A2:K2").Select
  Range(Selection, Selection.End(xlDown)).Select
  Selection.copy

たとえば A列以外でA列の行数より大きな行までデータがある部分があれば
その部分は貼り付け対象から漏れるということはお気づきですか?

Sub Sample()
  Dim mx As Long
  With Sheets("Sheet2")
    mx = .UsedRange.Cells(.UsedRange.Cells.Count).Row
    .Range("A2:K2").Resize(mx - 1).Copy Sheets("Sheet1").Range("B2")
    .Range("O2:W2").Resize(mx - 1).Copy Sheets("Sheet1").Range("M2")
    .Range("L2:N2").Resize(mx - 1).Copy Sheets("Sheet1").Range("V2")
  End With
End Sub
・ツリー全体表示

【78202】このマクロを1つにまとめたいんですが
質問  [名前なし]  - 16/5/25(水) 17:05 -

引用なし
パスワード
   Sheet2の「A2」〜「K2」、「O2」〜「W2」、「L2」〜「N2」の最終行までコピーを
Sheet1の「B2」にSheet2の「A2」〜「K2」に貼り付ける、Sheet1の「M2」にSheet2の「O2」〜「W2」、Sheet1の「V2」にSheet2の「L2」〜「N2」に貼りつけるマクロを1つにまとめたいのですが、いろいろ調べてみても見つかりませんでした。

Sub test()

  'Sheet2の「A2」〜「K2」の最終行までコピー
  Sheets("Sheet2").Select
  Range("A2:K2").Select
  Range(Selection, Selection.End(xlDown)).Select
  Selection.copy
  'Sheet1の「B2」に貼り付け
  Sheets("Sheet1").Select
  Range("B2").Select
  ActiveSheet.paste

  'Sheet2の「O2」〜「W2」の最終行までコピー
  Sheets("Sheet2").Select
  Range("O2:W2").Select
  Range(Selection, Selection.End(xlDown)).Select
  Selection.copy
  'Sheet1の「M2」に貼り付け
  Sheets("Sheet1").Select
  Range("M2").Select
  ActiveSheet.paste

  'Sheet2の「L2」〜「N2」の最終行までコピー
  Sheets("Sheet2").Select
  Range("L2:N2").Select
  Range(Selection, Selection.End(xlDown)).Select
  Selection.copy
  'Sheet1の「V2」に貼り付け
  Sheets("Sheet1").Select
  Range("V2").Select
  ActiveSheet.paste

End Sub

自分で上のマクロを1つにまとめましたが、エラーがでます。
上手く1つにまとめる方法はないでしょうか?

Sub test()

  'Sheet2の「A2」〜「K2」,「O2」〜「W2」,「L2」〜「N2」の最終行までコピー
  Sheets("Sheet2").Select
  Range("A2:K2, O2:W2, L2:N2").Select
  Range(Selection, Selection.End(xlDown)).Select
  Selection.copy
  'Sheet1の「B2」, 「M2」, 「V2」に貼り付け
  Sheets("Sheet1").Select
  Range("B2, M2, V2").Select
  ActiveSheet.paste

End Sub

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

【78201】Re:月が変わるとセルの色を変えたい。
発言  γ  - 16/5/24(火) 21:29 -

引用なし
パスワード
   別の方法で対応するとのこと。結構なことです。

なお、私は仕事中はこちらには来ません。
自宅でしかアクセスしない方針です。

ついでに。
変数に各月の情報を持たせるなどということではなく(それは無理)、
シートは広いのですから、各月の情報をシートにもたせるのが
普通の考え方です。
・ツリー全体表示

【78200】Re:エクセル内のデータ転送に関して
発言  β  - 16/5/24(火) 21:19 -

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

まず col は、1行目の右端(XFD1)から左にみて最後にデータがある列番号。
つまり、このリストの一番右の列になりますね。

で、Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp))

これは、その列の 1行目のセルからから、その列のデータ最終セルまでの領域。
かりに、2回目の場合、colが 9(つまりI列)で、I列のデータ最終行が20行目だとすると
この領域は I1:I20 になりますね。それを左に3つ広げますので I1:K20 つまり
2回目の領域全体になります。

そうしますと adr1 = .Cells(1).Address(False, True)

これは I1:K20の領域の最初のセル つまり I1。このアドレス文字列を取得しています。
この時、行は相対表示、列は絶対表示という指定(False,True) をしていますので
adr1 に格納される文字列は $I1 になります。

もう1つ adr0 文字列を説明しておきます。

adr0 = Range("A1", Range("A" & Rows.Count).End(xlUp)).Resize(, 3).Address

かりに A列データ最終行が 20 なら A1:C20 になるわけですが Address取得時の
相対、絶対 を省略しています。省略した場合絶対になります。
したがって $A$1:$C$20 になっています。

で、処理としては 『ある領域』に数式を埋め込んでいます。
この場合、ある領域 の左上隅にセットする数式を与えると、
シート上で右に、下にフィルコピーした場合に、式の中身が相対的に変化しますけど
それと同じ状態でセットされます。

ある領域 というのは
With Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Resize(, 3)
つまり、I1:K20 これの .Columns("B:C") これは2番目と3番目の列ということになりますので
J1:K20 ですね。

この左上隅のセル つまり J1 に

"=IFERROR(VLOOKUP(" & adr1 & "," & adr0 & ",COLUMN(B1),FALSE),""登録なし"")"

こんな式をセットしています。
変数 adr1 や adr2 を 上で説明した例になおしますと

=IFERROR(VLOOKUP($I1,$A$1:$C$20,COLUMN(B1),FALSE),"登録なし")

こうなります。
Columns(B1) って 2 ですから、この式は
=IFERROR(VLOOKUP($I1,$A$1:$C$20,2,FALSE),"登録なし")

これを右に(つまりK1)にフィルコピーすると
=IFERROR(VLOOKUP($I1,$A$1:$C$20,COLUMN(C1),FALSE),"登録なし")
つまり =IFERROR(VLOOKUP($I1,$A$1:$C$20,3,FALSE),"登録なし")
になりますね。

いずれにしても J1 に
=IFERROR(VLOOKUP($I1,$A$1:$C$20,COLUMN(B1),FALSE),"登録なし")
を入れて、これうぃK列にフィルコピーした後下にフィルコピーしてみてください。
どのように式が変化するか、よくわかると思います。
・ツリー全体表示

【78199】Re:月が変わるとセルの色を変えたい。
お礼  [名前なし]  - 16/5/24(火) 13:24 -

引用なし
パスワード
   知人からのアドバイスがあり
別の方法で試してみる事にしました。

多忙の中、ご指摘いただきありがとうございました。
・ツリー全体表示

【78198】Re:エクセル内のデータ転送に関して
お礼  TODD  - 16/5/24(火) 12:34 -

引用なし
パスワード
   β さん:
ご返答有難う御座います。たいへん助かります。
こちらのご返答が遅くなり申し訳御座いません。
現在、内容を確認させて頂いておりますが、
先にTestについてご質問させて下さい。

With Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Resize(, 3)
→ワークシートの左側に入力されている文字の行・列を範囲を選択し、
その範囲を3行右に広げる。

それ以降の箇所はどのような意味になっているのでしょうか?
adr1 = .Cells(1).Address(False, True)
.Columns("B:C").Formula = "=IFERROR(VLOOKUP(" & adr1 & "," & adr0 & ",COLUMN(B1),FALSE),""登録なし"")"
.Value = .Value

分割して試してみたり、ネット調べてみたのですが分からず、時間が
掛かってしましました。 早急にご対応頂きましたので、申し訳御座いません。

以上


▼β さん:
>▼TODD さん:
>
>要件誤解あれば指摘願います。
>
>Sub Test()
>  Dim col As Long
>  Dim adr0 As String
>  Dim adr1 As String
>  
>  col = Cells(1, Columns.Count).End(xlToLeft).Column
>  adr0 = Range("A1", Range("A" & Rows.Count).End(xlUp)).Resize(, 3).Address
>  
>  With Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Resize(, 3)
>    adr1 = .Cells(1).Address(False, True)
>    .Columns("B:C").Formula = "=IFERROR(VLOOKUP(" & adr1 & "," & adr0 & ",COLUMN(B1),FALSE),""登録なし"")"
>    .Value = .Value
>  End With
>  
>End Sub
・ツリー全体表示

【78197】Re:月が変わるとセルの色を変えたい。
発言  [名前なし]  - 16/5/24(火) 9:53 -

引用なし
パスワード
   これが名前と月と日にちから一致するセルを求め、色を付けるコードになります。

'///名前を列から検索///
  rt = Range("A7:A21").Find(name).Row

  '///月を変更///
  Range("K1") = month1


  '///日にちを検索して代入///
  gy1 = Range("B4:AE4").Find(hi1).Column

  '///休みを入れる///
  cells(rt, gy1).Interior.Color = RGB(0, 220, 255)
  
  onyr1 = Range("B7:AF21")
・ツリー全体表示

【78196】Re:月が変わるとセルの色を変えたい。
発言  [名前なし]  - 16/5/24(火) 9:48 -

引用なし
パスワード
   返信遅れて申し訳ございません。

昨日の質問の説明が全然足りず大変申し訳ございません。
ご指摘をいただいたので、詳しく書いていきます。

一年の休暇予定表を作成しています。

まずカレンダーですが、B4からAF4まで横に日付が並んでいます。この下のセルに曜日があります。月はK1にコンボボックスで選択できるようになっています。コンボボックスは開発タブより作っています。
各個人の名前はA7からA21まで縦に並んでいます。

ユーザーフォームで名前と取りたい休日の月と日にちを入力すると、まずシート上の月のコンボボックスに入力した月が代入されます。ここで月が変わります。そして名前と日にちが一致するセル(列と行)を検索し、一致したセルに色を付けます。

現在行詰まっているのは、シート上の月のコンボボックスを変更したとき(例9月から12月に変えた時)、変えただけではセルに付いた色はそののままです。一年間の予定表なので、月を変えるごとに色付きのセルを表示させたいです。(9月なら9月の休暇予定表を表示させる)
私がやってみたことは、Range("B7:Af21")を範囲選択して、12個の変数を用意し、9月ならsepという変数に代入します。シート上のコンボボックスが9月を選択されたらシートのRange("B7:Af21")にsepを代入するという方法です(これは他の月でも同じです。)
実行してみると、B7:AF21が真っ黒になってしまいます。ネットで検索してみたところ、範囲取得はできないようでした。

結論としては、月ごとに色付きのセル(休暇予定日)を表示させることです。
行詰まっているのが、シート上のコンボボックスを変えたとき、その月の休暇予定日を変数に記憶させて、選択した月の休暇予定日が入っている変数を呼び出し表示させることです。月を白紙に戻す訳ではなく、記憶させて一度シートを白紙にしてから表示させるという意味です。
・ツリー全体表示

【78195】Re:月が変わるとセルの色を変えたい。
発言  γ  - 16/5/23(月) 22:45 -

引用なし
パスワード
   ユーザーフォームで指定する情報は、
・名前
・日付

シートには、
・月のコンボボックスと
・コンボボックスの月に応じた日付が横一列にならんでいる。

日付と氏名が一致するセルに休日と書き込みたい、ということですね。

(ところで、
 月が変わったら、前の月の情報は消えてよいのですね。
 9月から12月に変わって、また9月に戻すということはないんですね。)


(1)やろうとしていうことを分解すると下記だろうか。
 (a)ユーザーフォームに入れた日付(●月○日等)から、月を取り出し、
 (b)シートのコンボボックスを更新する
 (c)日付と名前をもとに、何行目の何列かを計算する
 (d)そのセルに"休日"と書き込む

(2) 上の(a)については、日付の形式が不明なので回答不可。

(3) (b)については、
  シートのコンボボックスがActiveXなのかフォームコントロールなのか不明ですが、
  たぶん前者。
  そのリンクされたセルに、直接、値(月)を書き込めば、
  コンボボックスの値は変更できます。
  これに応じてカレンダが更新されるはず。
  (その月の休日情報をどうするかは問題とされていないと理解)

(4) (c)
  名前については、Application.Matchで何番目の行かわかるはず。
  日にちについては数えなくてもわかります。

(5)セル範囲をCells(j,k)形式で指定すれば 入力はできるはずです。

今までのコードが書けているなら、上記のことは簡単にできるはずです。
こちらの理解が違っているのも知れないが。

質問にあたってどこに詰まっているのか書かなければ、質問の意味がないです。

私は時間がとれないので、以上とさせていただきます。
・ツリー全体表示

【78194】Re:月が変わるとセルの色を変えたい。
発言  T  - 16/5/23(月) 21:43 -

引用なし
パスワード
   説明が下手ですみません。

実はユーザーフォームから名前と日付を選択して、
名前の列と日付の行から一致するセルを検索して、cell()で検索した値を組み合わせセルに色を付ける仕様となっています。

ちょっと今手元にエクセルが無いのでコード等は明日になってしまいます。
申し訳ありません。

カレンダーは同じシートにあります。というのもシートの一個のセルがコンボボックスになっており、12までの数字が選択できるようになっています。これが「月」を表し、このコンボボックスを変えるとカレンダーの日付もその月に合った日付に変わります。2月に変えたら29日までしか表示させないようにする等です。

現時点での説明できるのはこれだけです・・・全く分からないというのも私の説明が下手なせいですね・・・申し訳ありません。
・ツリー全体表示

【78193】Re:月が変わるとセルの色を変えたい。
質問  γ  - 16/5/23(月) 21:20 -

引用なし
パスワード
   ちょっとよくわかりません。

> 例えばAさんが9/21(水)に休日を入れたとします。
> そうすると21日とAさんが一致するセルに色が付きます。
> ここまでは問題ないのですが
問題がないそうですが、
こちらにはどこに何を表示しているのかさっぱり分かりません。
カレンダーはシートにあるんですか?
9月と12月のカレンダーは別の場所にあるんですか?

9月のカレンダを作成するコード
9月の休日に色を付ける部分のコード、
それらのコードを示してもらえますか?
・ツリー全体表示

【78192】月が変わるとセルの色を変えたい。
質問  T  - 16/5/23(月) 11:25 -

引用なし
パスワード
   こんにちは。
初めての投稿となります。

VBAでカレンダーを作成しています。
月はコンボボックスで選択するようにしています。月に合わせて日にちと曜日が連動します。AさんからCさんがいて、例えばAさんが9/21(水)に休日を入れたとします。そうすると21日とAさんが一致するセルに色が付きます。ここまでは問題ないのですが、コンボボックスの値を変更すると月は変わりますが色はそのままです。カレンダーは一年分あり、個人が入れる休日はそれぞれです。
目的は、月が変わったらその月に入っている色を表示することです。(例9月から12月に変更したら、9月の色付きのセルから12月の色付きのセルに変更したい。)
 9月(コンボボックス)
 1 2 3 4 5 6

A
B
C

どうかご教授の方、よろしくお願いいたします。
・ツリー全体表示

【78191】Re:worksheetの宣言の違いがわかりません
お礼  I  - 16/5/21(土) 23:58 -

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

丁寧にご回答ありがとうございます。
参考にさせていただきます。


>▼I さん:
>
>同じものです。
>
>VBA の世界でコードを書く場合、規定された様々な名前 (WorkSheet等) を使うわけですが
>これらの名前は、それぞれ、『ある大箱』に入っています。
>大箱の名前は VAB であったり Excel であったり。
>VBE画面でオブジェクトブラウザを表示し、一番上のコンボボックスを開くと、大箱の名前が列挙されています。
>このなかで、たとえば Excel を選ぶと、Excel という名前の大箱に入っているメンバが クラス欄に列挙されます。
>
>また、このメンバが、この大箱の中の中箱、さらに、その中のメンバが中箱の中の小箱という場合もあります。
>
>記述としては 大箱名.中箱名.小箱名.なんたら と書くのが正式なんでしょうけど面倒ですよね。
>なので、ふつうは、箱の名前を省略します。省略しても、ほとんどのメンバ名はユニークなので
>どの箱に入っている名前なのかをVBEが判断してくれます。
>
>なかには Excel大箱の中のApplication中箱のなかのINPUTBOXメソッドと、
>VBA大箱の中のInteraction中箱の中のINPUTBOX関数 といったように、おなじ名前のものがあります。
>
>この場合、何もつけずに InputBox と記述すると、VBA大箱の中のものを優先して使うようですね。
>なので、InputBoxメソッドを使いたい場合は Application.InputBox と記述します。
・ツリー全体表示

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