Excel VBA質問箱 IV

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

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


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

【76045】Re:VBA 検索に該当すれば指定列に値を入...
発言  独覚  - 14/9/3(水) 9:11 -

引用なし
パスワード
   ▼みみ さん:
あらかじめ在庫シートのP列に式を入れておいて別シートに入力された時点で「済」マークを
表示させることもできるけれどもマクロと式のどちらがいいですか?

あと、マクロの場合も別シートで入力された時点で反映させることもできますよ。
・ツリー全体表示

【76044】VBA 検索に該当すれば指定列に値を入れ...
質問  みみ  - 14/9/3(水) 3:08 -

引用なし
パスワード
   こんばんは。
色々調べてみましたが、初心者故解決方法が分かりません。
業務に支障をきたしているので、下記の方法ができれば非常に
助かります。お力添えをお願いします。


1.シート名”在庫”J列(J4以降日々増えます)に商品番号が入っています。

2.別シートD列(D2以降)に入力した商品番号(複数)と在庫シートの商品番号
 が合致すれば在庫シートの商品番号と同行のP列に「済」を入力したいです。

3.「済」入力実行ボタンを別シート上に作りたい。

よろしくお願いします。


Sub Test()
 Dim R As Long
 For R = 1 To Cells(Rows.Count, "在庫!J:J").End(xlUp).Row
   If Cells(R, "在庫!J:J").Value = "D:D" Then
     Cells(R, "在庫!P:P").Value = 済
   End If
 Next R
End Sub
・ツリー全体表示

【76043】Re:同じ商品のガントチャートをまとめたい
発言  γ  - 14/9/1(月) 21:49 -

引用なし
パスワード
   > VBA質問箱基本ポリシー
> ■してはいけない質問について
> 困ったことは基本的にどんな質問をされてもかまわないのですが、
> その中でも不適切な質問、というのがあります。
> 以下のような質問は原則としてしないでください。お願いします。
>  ・丸投げ
>  「○○するにはどうすればいいか教えてください」といったような、
>   コードを最初から最後まで教えてもらうことを期待するような質問

上記に抵触しています。
丸投げではなく、
シートのレイアウトや、出来ているところを示して、
自分が詰まっているところを具体的に質問してはどうですか?
・ツリー全体表示

【76042】同じ商品のガントチャートをまとめたい
質問  くら  - 14/9/1(月) 2:26 -

引用なし
パスワード
   前回に続いてお世話になります。VB初心者のくらと申します。
Excel2003で商品の貸出・返却状況についてガントチャートを作ろうとしています。

Sheet1のユーザーフォームに商品コード(半角英数字)と貸出日、返却日を入力した場合(inputboxは3つ、commandbuttonは1つ)に、Sheet2のA列(A2以下に記載)から商品コードを検索し、該当する行(Sheet2)にバーチャートを表示したいと考えています。Sheet2の1列目(B1から)はWEEKDAY関数を用いてカレンダー表示(1年分)とし、塗りつぶしか棒線で表示したいです。
1回の入力操作だけで商品コードを検索し、同じ行に複数のバーチャートを作成するということはExcelで可能なのでしょうか?コードも教えていただけると助かります。

Accessを用いたものがあったので、同時並行的に勉強しているのですが、誰でも使えるようにしたいので、できればExcelでと考えています。
条件付き書式やオートフィルタなどを駆使してイメージはできるのですが、なかなか形にならなくてもがいております。どうか助言お願いします。
・ツリー全体表示

【76041】Re:一覧表に合致するファイルをサブディ...
お礼  himawari  - 14/8/26(火) 12:20 -

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

早速ご助言いただき、ありがとうございました。
サンプルとbefore-afterを頂いたことで、
サンプルを動かして処理を確認しながら、
自身のマクロに反映することができました。

cmd実行の部分はまだ理解しきれていないので
これから調べて知識を身に着けようと思います。

また、まだまだ不格好なマクロなので、
高速化を意識して、改修を続けたいと思います。

本当にありがとうございました。
・ツリー全体表示

【76040】Re:一覧表に合致するファイルをサブディ...
発言  kanabun  - 14/8/25(月) 19:48 -

引用なし
パスワード
   なので
>   caseFile = caseFolderPath & "*" & caseID & "*.xls?"
>   caseFileName = Dir(caseFile)
>   '存在しない場合
>   If caseFileName = "" Then
>     GoTo Continue
>   
>   '存在する場合
>   Else
>     Set caseBook = Workbooks.Open(caseFolderPath & caseFileName)

をDir2 に置換すると 以下のようです

>   caseFile = caseFolderPath & "*" & caseID & "*.xls?"
   caseFileName = Dir2(caseFile)
>   '存在しない場合
>   If caseFileName = "" Then
>     GoTo Continue
>   
>   '存在する場合
>   Else
     Set caseBook = Workbooks.Open(caseFileName)
・ツリー全体表示

【76039】Re:一覧表に合致するファイルをサブディ...
発言  kanabun  - 14/8/25(月) 19:43 -

引用なし
パスワード
   上のサンプルは Dir関数の代わりに、
Dir2という名の Dirコマンドを呼び出すサンプルです。サブディレクトリも
検索するオプションを指定しています。
Dir関数は ファイル名のみ返しますが、
Dir2 自作関数は パス名付きのファイル名を返します。
ワイルドカードを使ったりすると、複数のファイルパスが返ってきますが、
Dir2関数は必ず最初にヒットしたファイルパスだけ返すように組んであります。
・ツリー全体表示

【76038】Re:一覧表に合致するファイルをサブディ...
発言  kanabun  - 14/8/25(月) 19:34 -

引用なし
パスワード
   Dir関数の代わりに Dirコマンドを使ってサブディレクトリも同時検索する
サンプルです。

'-----------------------------------------------------------
Option Explicit

'// D:\(Data)\temp\subTemp\JoinCSV200.csv を D:\(Data)\ を指定して検索
Sub Example()
  Dim caseFolderPath$: caseFolderPath = "D:\(Data)\"
  Dim caseFilename$

  caseFilename = Dir2(caseFolderPath & "JoinCSV200*.csv")
  MsgBox caseFilename

End Sub

'サブフォルダを含むファイルの検索(最初に見つかったファイルパスを返す)
Private Function Dir2(PathFilename As String) As String
  Dim i As Long
  Dim tmpPath As String
  Dim sCmd As String
  Dim ko As Long
  
  tmpPath = Environ$("Temp") & "\Dir.tmp"  '◆Dirの結果ファイル出力パスファイル名  ←適宜変更
  sCmd = "DIR """ & PathFilename & """ /b /s > """ & tmpPath & """"
        '/b:ファイル名のみ  /s: サブディレクトリも検索
  Debug.Print sCmd
  With CreateObject("WScript.Shell")
    ko = .Run("CMD /C " & sCmd, 7, True) 'Dirコマンド実行
  End With

  If FileLen(tmpPath) < 3 Then Exit Function
  Dim io%
  Dim buf() As Byte
  io = FreeFile()
  Open tmpPath For Binary As io
   ReDim buf(1 To LOF(io))
   Get #io, , buf
  Close io
  Kill tmpPath
  Dir2 = Split(StrConv(buf, vbUnicode), vbCrLf)(0)
End Function
・ツリー全体表示

【76037】Re:一覧表に合致するファイルをサブディ...
発言  kanabun  - 14/8/25(月) 19:12 -

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

>現時点では、指定フォルダ直下にファイルが存在する場合は正しく動作します。
>今回改修により、指定フォルダのサブフォルダを含めてファイルを検索し、
>動作するようにしたいです。

全体はよく見てませんが、
要は

>      caseFile = caseFolderPath & "*" & caseID & "*.xls?"
>      caseFileName = Dir(caseFile)

ここで、サブフォルダも含めたファイルの検索結果が返ってくれば
いいわけですよね?
Dir関数の再帰処理でも FSO でもいいけど、Dirコマンドという手もありますよ。
これなら再帰処理書かなくてサブフォルダ検索が高速処理できます。
・ツリー全体表示

【76036】一覧表に合致するファイルをサブディレク...
質問  himawari  - 14/8/25(月) 17:59 -

引用なし
パスワード
   環境:Excel2010

はじめまして、マクロ初心者のhimawariと申します。

一覧表の項目名を含むファイルを検索し、
ファイルの内容を参照して、一覧表に反映するマクロを作っています。
マクロ実行の際は、ファイルを格納したフォルダを指定する仕組みです。

現時点では、指定フォルダ直下にファイルが存在する場合は正しく動作します。
今回改修により、指定フォルダのサブフォルダを含めてファイルを検索し、
動作するようにしたいです。

過去ログ等を読み、サブフォルダを含めたファイル検索は
FileSystemObject(FSO)やDir関数の再帰呼び出しを使用することは
理解したのですが、現行の仕組みにどう反映していいか応用ができません。
一覧表ありきの仕組みを想定して、一覧表にないファイルは無視という仕組みとしているためです。
添付するマクロをもとに、アドバイスを頂けたらと思います。
よろしくお願いいたします。

以下、イメージです
[一覧表]
No.1 とちおとめ
No.2 あまおう
No.3 ジョナゴールド
No.4 ふじ

[フォルダ構成]
果物フォルダ
 -いちごフォルダ
  -xxxxx_とちおとめ.xls
  -xxxxx_あまおう.xls
 -りんごフォルダ
  -xxxxx_ジョナゴールド.xls
  -xxxxx_ふじ.xls

[マクロ実行時]
1.一覧表の格納先を指定
2.個別ファイルの格納先を指定
3.実行

具体的には、果物フォルダにファイルがあれば動くマクロを、
いちごフォルダやりんごフォルダにファイルがある場合も動くようにしたいです。
不要そうなソースは削除してますが、情報が必要な場合は連絡ください。


Option Explicit

  '一覧用の変数
  Dim listBook As Workbook      'ワークブック
  Dim listSheet As Worksheet     'ワークシート
  Dim listPath As Variant       '指定されたフォルダパス
  Dim listFolderPath As String    '格納先フォルダ
  Dim listFileName As String     'ファイル名
  Dim listRow As Long         '一覧の行数
  Dim listMaxRow As Long       '一覧の最終行
  Dim listColumn As Long       '実績欄の開始列
  Dim listColumn1 As Long       '開始日列

  '個票用の変数
  Dim caseBook As Workbook      'ワークブック
  Dim caseSheet As Worksheet     'ワークシート
  Dim casePath As Variant       '指定されたフォルダパス
  Dim caseFolderPath As String    '格納先フォルダ
  Dim caseID As String        'フルーツ名
  Dim caseFile As String       'フルーツ名より作成したファイル名
  Dim caseFileName As String     'ファイル名

  Dim buf As String          'ファイル名取得用変数

  'その他もろもろ
  Dim xlAPP As Application

 
  Sub updateList()
  
  listPath = Cells(15, 3).Value
  listFolderPath = listPath & "\"
  listFileName = listFolderPath & "\[一覧ファイル名].xls"
  Set listBook = Application.Workbooks.Open(listFileName)
  Set listSheet = listBook.Worksheets("[シート名]")
  
  '最終行番号の取得
  listMaxRow = Cells(Rows.Count, "B").End(xlUp).Row
  
  '実績列番号の取得
  listSheet.Activate
  listColumn = Cells(1, 1).End(xlToRight).Column
  listColumn1 = listColumn + 2

  '(開始時)
  Application.EnableEvents = False
  Application.DisplayAlerts = False
  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual

  
    For listRow = 6 To listMaxRow
      '個票を検索する
      caseID = listSheet.Cells(listRow, 2)
      casePath = Cells(16, 3).Value
      caseFolderPath = casePath & "\"
      caseFile = caseFolderPath & "*" & caseID & "*.xls?"
      caseFileName = Dir(caseFile)
        '存在しない場合
        If caseFileName = "" Then
          GoTo Continue
        '存在する場合
        Else
          Set caseBook = Application.Workbooks.Open(caseFolderPath & caseFileName)
          Set caseSheet = caseBook.Worksheets("[シート名]")
                   
          '反映
          listSheet.Cells(listRow, listColumn1).Value = caseSheet.Cells(7, 33)
                              
          'テストケースを閉じる
          caseBook.Close
          Set caseBook = Nothing
        End If
Continue:
    Next listRow

  listBook.Save
  Set listBook = Nothing

  Application.DisplayAlerts = True
  Application.EnableEvents = True
  Application.ScreenUpdating = True
  Application.Calculation = xlCalculationAutomatic

 End Sub
・ツリー全体表示

【76035】Re:非表示について
発言  独覚  - 14/8/25(月) 9:08 -

引用なし
パスワード
   解決策になるかわかりませんが。

別のブックを開く際には先にEXCELそのものを起動してからファイルの開くで開いては
どうでしょうか?
・ツリー全体表示

【76034】Re:(Excel2003)検索後、ListBoxに行抽...
回答  くら  - 14/8/25(月) 0:32 -

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

解決しました。あらかじめ作っておいてさんざんいじったファイルに足しただけでなく、こちらの手違いで焦ってしまい、泥沼にはまっていました。

新しく最初から作り直した上でkanabunさんのコードを組み込んだところ、しっかりと動きました。申し訳ありません。
ただ、最初のコードだと4列目を検索していないようです。(4列目に漢字やひらがなを入れて実行しても表示されませんでした。)

引き続き微調整がんばって様子を見たいと思います。
・ツリー全体表示

【76033】Re:(Excel2003)検索後、ListBoxに行抽...
発言  kanabun  - 14/8/24(日) 23:51 -

引用なし
パスワード
   ▼くら さん:
>kanabunさん
>すいません。こういうのは正確性が大切でした。
そうですよ(^^)

>実行してみたところ、
>Private Sub CommandButton1_Click()
>以下でコンパイルエラー(変数が定義されていない)
>
>ということです。

Option Explicit
を宣言してありますから、宣言してない変数はみな 未定義の警告を受けます。
どの変数が (変数が定義されていない) なのですか?
・ツリー全体表示

【76032】Re:(Excel2003)検索後、ListBoxに行抽...
回答  くら  - 14/8/24(日) 23:49 -

引用なし
パスワード
   そうなんです。
PCに弱い人がいて、全角入力でも検索できるといいなというかんじです。
表中の数字を全角にしてしまう手も考えたのですが、表自体の更新作業がめんどくさそうということで全角でも半角でも検索できないかという案が出ました。
コードが極端に増えるなどの弊害があれば、表をいじることも考えるつもりでした。
・ツリー全体表示

【76031】Re:(Excel2003)検索後、ListBoxに行抽...
回答  くら  - 14/8/24(日) 23:44 -

引用なし
パスワード
   kanabunさん
すいません。こういうのは正確性が大切でした。
実行してみたところ、
Private Sub CommandButton1_Click()
以下でコンパイルエラー(変数が定義されていない)

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

【76030】Re:(Excel2003)検索後、ListBoxに行抽...
発言  kanabun  - 14/8/24(日) 23:43 -

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

>Sheet2の表は以下のようなかんじで
>商品名   型番 機番 商品コード
>軽自    I2-K 1  2001
>普通自   I3-F 2  3002
>トラック  I5-H 4  5004
>電気自   I4-B 6  4006
>トラック  I5-M 9  5009
>軽トラ   IP2-G 8  2108

>検索ワードの想定ではトラや3002というワードで検索したいと考えています。

全角で「半角の商品コード」を検索するわけですか?

微調整で、以下のようにしてみてください

'-----------------------------------------------------------
Option Explicit
Private FRange As Range    'FilterRange
Private WkSheet As Worksheet '作業シート(非表示)

Private Sub UserForm_Initialize()
  Set FRange = Worksheets(2).[A1].CurrentRegion
  On Error Resume Next
  Set WkSheet = Worksheets("Temp")
  On Error GoTo 0
  If WkSheet Is Nothing Then
    With Worksheets
      Set WkSheet = .Add(After:=.Item(.Count))
    End With
    WkSheet.Name = "Temp"  '◆この行 追加を忘れていました m(_ _)m
    WkSheet.Visible = xlSheetHidden
  End If
  ListBox1.ColumnCount = 4
End Sub

Private Sub CommandButton1_Click()
 Dim ss As String
  
  ss = TextBox1.Text
  If Len(ss) < 1 Then Exit Sub
  ss = StrConv(ss, vbNarrow)
  If IsNumeric(ss) Then     '数値化可能なら 4列目
    FRange.AutoFilter 4, ss
  Else              'でなければ、1列目をAutoFilter
    FRange.AutoFilter 1, "*" & ss & "*"
  End If
  If FRange.Columns(1).SpecialCells(xlVisible).Count > 1 Then
    WkSheet.UsedRange.Clear
    Intersect(FRange, FRange.Offset(1)).Copy WkSheet.[A1]
    ListBox1.List = WkSheet.[A1].CurrentRegion.Value
  End If
  FRange.AutoFilter
End Sub
・ツリー全体表示

【76029】Re:(Excel2003)検索後、ListBoxに行抽...
発言  kanabun  - 14/8/24(日) 23:28 -

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

>返信ありがとうございます。
こちらこそ m(_ _)m
UserForm案、試してくださったんですね♪

>途中経過ですが、
>Private Sub CommandButton1_Click()で変数エラーがでるかんじで知恵を絞っているかんじです。
「かんじ」じゃ分りません。
どの行で、何というエラーメッセージが出るのですか?


>Sheet2の表は以下のようなかんじで
>商品名   型番 機番 商品コード
>軽自    I2-K 1  2001
>普通自   I3-F 2  3002
>トラック  I5-H 4  5004
>電気自   I4-B 6  4006
>トラック  I5-M 9  5009
>軽トラ   IP2-G 8  2108
>・
>・
>・
>です。
>検索ワードの想定ではトラや3002というワードで検索したいと考えています。
・ツリー全体表示

【76028】Re:(Excel2003)検索後、ListBoxに行抽...
質問  くら  - 14/8/24(日) 23:19 -

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

返信ありがとうございます。
途中経過ですが、
Private Sub CommandButton1_Click()で変数エラーがでるかんじで知恵を絞っているかんじです。
Sheet2の表は以下のようなかんじで
商品名   型番 機番 商品コード
軽自    I2-K 1  2001
普通自   I3-F 2  3002
トラック  I5-H 4  5004
電気自   I4-B 6  4006
トラック  I5-M 9  5009
軽トラ   IP2-G 8  2108



です。
検索ワードの想定ではトラや3002というワードで検索したいと考えています。
・ツリー全体表示

【76027】Re:(Excel2003)検索後、ListBoxに行抽...
発言  kanabun  - 14/8/24(日) 21:35 -

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

>Sheet2に商品名、型番、機番、商品コードを約500行ほど入力しております。
>Sheet1にフォームコントロールボタンを描写し、このボタンを押すと検索窓(TextBox1,CommandButton1,ListBox1)が開くかんじです。
>ここからTextBox1に商品名(A列)または商品コード(D列)の一部を全角で入力し、CommandButton1を押すとSheet2を参照し、一部でも合致した行に含まれる4列のデータすべてをListBox1に抽出表示したいというわけです。部分合致なので複数行の表示を想定し、ListBox1は横長となっています。

> >Sheet1にフォームコントロールボタン

と書いてあるのに、あっち向いてホイッ のような発言で申し訳ないのですが、
フォームコントロール ではなく ユーザーフォーム でのたたき台です。

以下は UserForm1のコードです。
メニュ−[挿入]-[UserFormの挿入]でUserForm1を挿入し、
そこに

 TextBox1
 CommandButton1
 ListBox1

を配置して お試しください。

'-----------------------------------------------------------
Option Explicit
Private FRange As Range    'FilterRange
Private WkSheet As Worksheet '作業シート(非表示)

Private Sub UserForm_Initialize()
  Set FRange = Worksheets(2).[A1].CurrentRegion
  On Error Resume Next
  Set WkSheet = Worksheets("Temp")
  On Error GoTo 0
  If WkSheet Is Nothing Then
    With Worksheets
      Set WkSheet = .Add(After:=.Item(.Count))
    End With
    WkSheet.Visible = xlSheetHidden
  End If
  ListBox1.ColumnCount = 4
End Sub

Private Sub CommandButton1_Click()
 Dim ss As String
 Dim col As Long
  ss = TextBox1.Text
  If Len(ss) < 1 Then Exit Sub
  If IsNumeric(ss) Then col = 4 Else col = 1
  FRange.AutoFilter col, "*" & ss & "*"
  If FRange.Columns(1).SpecialCells(xlVisible).Count > 1 Then
    WkSheet.UsedRange.Clear
    Intersect(FRange, FRange.Offset(1)).Copy WkSheet.[A1]
    ListBox1.List = WkSheet.[A1].CurrentRegion.Value
  End If
  FRange.AutoFilter
End Sub
・ツリー全体表示

【76026】(Excel2003)検索後、ListBoxに行抽出で...
質問  くら  - 14/8/24(日) 21:11 -

引用なし
パスワード
   マクロとコードを勉強し始めたばかりの初心者です。
状況は以下のとおりです。
Sheet2に商品名、型番、機番、商品コードを約500行ほど入力しております。
Sheet1にフォームコントロールボタンを描写し、このボタンを押すと検索窓(TextBox1,CommandButton1,ListBox1)が開くかんじです。
ここからTextBox1に商品名(A列)または商品コード(D列)の一部を全角で入力し、CommandButton1を押すとSheet2を参照し、一部でも合致した行に含まれる4列のデータすべてをListBox1に抽出表示したいというわけです。部分合致なので複数行の表示を想定し、ListBox1は横長となっています。

この一連の操作のコードが分からず困っています。よろしくお願いします。
・ツリー全体表示

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