Excel VBA質問箱 IV

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

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


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

【76206】Re:開いた時の状態に戻すボタンを作成し...
発言  カリーニン  - 14/10/14(火) 20:43 -

引用なし
パスワード
   テンプレート用のブックを用意しておき、テンプレートブックをコピーして使うようにすれば
いいとおもいます。
・ツリー全体表示

【76205】開いた時の状態に戻すボタンを作成したい
質問  hamako  - 14/10/14(火) 12:44 -

引用なし
パスワード
   伝票作成画面をエクセルで作成しています。

ランダムのセルに
関数や計算式等が入っており、関数を利用する場合もあれば、
関数や計算式を消して直接入力する事もあります。

現在は伝票作成するたびに
上書きせずに閉じ、開きなおして次の伝票を作成しています。
この手間をはぶく為に「初期に戻す」などといったマクロボタン
を作成したいのですが
どのようにしたらいいかわかりません・・m(__)m

「入力したセルの値を全てクリア」でよければ解決なのですが、
関数を利用する場合もあれば、関数を消して直接入力してしまう場合も
ある為、このような事はできるのでしょうか??
大変お手数ですがよろしくお願いします。
・ツリー全体表示

【76204】Re:タブレット端末で実行できるようにし...
発言  γ  - 14/10/13(月) 19:08 -

引用なし
パスワード
   コードの問題じゃなく、タブレット端末の使い方の問題だと思います。

>タブレットでは、(タブレットではないPCの)ダブルクリックなどに
>相当する操作がきちんとできているのか、
と尋ねているのにそれに関する返答もなく、自分の要求を繰り返すだけなら、
時間の無駄です。

ここは、ExcelVBAに関する質問をするところなので、
他の方からコメントありませんでしたし、
どうしても自分で調べる気がしないなら、
別のところで質問したほうが良いですね。
・ツリー全体表示

【76203】Re:フォルダー内のエクセルのシート名を...
お礼  ペンネーム船長  - 14/10/13(月) 18:50 -

引用なし
パスワード
   γさん kanabunさん 
ご教授有難う御座いました。
ここでのアドバイスを生かして【76193】の質問を解決しました。
今回も色々な事を教えていただきまして、感謝しています。
・ツリー全体表示

【76202】Re:シート名の先頭が変化するシートを特...
お礼  ペンネーム船長  - 14/10/13(月) 18:43 -

引用なし
パスワード
   γさん  kanabunさん 
アドバイス有難う御座いました。
みなさんのコードを使わせて頂いて下記のようなコードに変更したら、上手くゆきました。
ExecuteExcel4Macro は無闇に使わない方が良いという記事は参考になりました。
これからも宜しくお願いします。

Private Sub CommandButton1_Click()
On Error Resume Next 'エラーを無視する
  Dim buf As String
  Dim wb As Workbook
  Dim sh As Worksheet
  Dim sh2 As Worksheet
        
  Set sh2 = Worksheets("調査結果")
  Const path = "C:\Users\○●\Desktop\test\"
        
  buf = Dir(path & "*.xls")
        
  Do While buf <> ""
    Set wb = Workbooks.Open(path & buf)
    MsgBox "これからチェックするブックは『" & buf & "』です"
    For Each sh In Worksheets
      MsgBox "チェックするシートは『" & sh.Name & "』です"
      
      If sh.Name Like "*あいうえお*" Then
       Set obj = sh.Range("G:G").Find(what:="2-")
       MsgBox "objの内容は『" & obj & "』です"
 
         If obj Is Nothing Then
          MsgBox "『2-』が無いブック名は『" & buf & "』です"
          sh2.Cells(Rows.Count, 2).End(xlUp).Offset(1, 0) = buf
         End If
       Else
         MsgBox "このシートは調査対象ではありません"
      End If
      
    Next sh
    wb.Close False
    buf = Dir()
  Loop
End Sub
・ツリー全体表示

【76201】Re:タブレット端末で実行できるようにし...
発言  おかわりくん  - 14/10/13(月) 18:27 -

引用なし
パスワード
   ▼γ さん:
ご回答ありがとうございます。
他の端末で動作確認はできました。が、やはりタブレット端末だけ動作が確認出来ません。
改善点をこうすれば、という記述をご面倒お掛けいたしますが、お願いできないでしょうか?
・ツリー全体表示

【76200】Re:フォルダー内のエクセルのシート名を...
発言  kanabun  - 14/10/13(月) 14:27 -

引用なし
パスワード
   しかも、根本的に 構文を間違えてるし (汗!!)

以下、おおまちがい

>   Workbooks(buf).Open

>   Workbooks(Bookのパス).Open
>が構文ですから、

>   Workbooks(path & buf).Open
>

反面教師の巻でした m(_ _)m
・ツリー全体表示

【76199】Re:フォルダー内のエクセルのシート名を...
発言  kanabun  - 14/10/13(月) 14:18 -

引用なし
パスワード
   すみません。
画面を更新せず、発言してしまいました m(_ _)m
・ツリー全体表示

【76198】Re:フォルダー内のエクセルのシート名を...
発言  kanabun  - 14/10/13(月) 14:17 -

引用なし
パスワード
   ▼ペンネーム船長 さん:

>Const path = "C:\Users\○●\Desktop\test\"
>
>buf = Dir(path & "*.xls")
>
>Do While buf <> ""
>  Workbooks(" & buf & ").Open

最後の構文は
   Workbooks(buf).Open

>  Workbooks(" & buf & ").Open
では、
  「 & buf & 」 という名前のブックをOpenという命令になっています。

それと
   Workbooks(Bookのパス).Open
が構文ですから、

>buf = Dir(path & "*.xls")

では bufのなかに たとえば "あいうえ.xls" のように正味のBook名しか
入っていません。

   Workbooks(path & buf).Open

のようにパス付でBook名を指定してください。
・ツリー全体表示

【76197】Re:フォルダー内のエクセルのシート名を...
発言  γ  - 14/10/13(月) 14:10 -

引用なし
パスワード
   こんにちは。
対比してみてください。

Private Sub CommandButton1_Click()
  Dim buf As String
  Dim wb As Workbook
  Dim sh As Worksheet

  Const path = "C:\Users\○●\Desktop\test\"

  buf = Dir(path & "*.xls")

  Do While buf <> ""
    Set wb = Workbooks.Open(path & buf)
    MsgBox "ブック名は『" & buf & "』です"
    For Each sh In wb.Worksheets
      MsgBox "シート名は『" & sh.Name & "』です"
    Next sh
    wb.Close False
    buf = Dir()
  Loop
End Sub
・ツリー全体表示

【76196】フォルダー内のエクセルのシート名を順次...
質問  ペンネーム船長  - 14/10/13(月) 14:01 -

引用なし
パスワード
   【質問】
ただいま、別の質問で質問させていただいていますが、それを解決する前に
聞きたいことがあります。
『test』フォルダー内に複数あるエクセルを順次開き、それぞれのエクセルの
シート名を調べるコードですが、bufのエクセルが対象になりません。
どこがいけないのか教えて下さい。

Private Sub CommandButton1_Click()

Dim buf As String
Dim sh As Worksheet

Const path = "C:\Users\○●\Desktop\test\"

buf = Dir(path & "*.xls")

Do While buf <> ""
  Workbooks(" & buf & ").Open
  MsgBox "ブック名は『" & buf & "』です"
  MsgBox "アクティブブックは『" & ActiveWorkbook.Name & "』です"
      For Each sh In Worksheets
        Workbooks(" & buf & ").sh.Select
        MsgBox "シート名は『" & Workbooks(" & buf & ").sh.Name & "』です"
      Next sh
 buf = Dir()
Loop

End Sub
・ツリー全体表示

【76195】Re:シート名の先頭が変化するシートを特...
発言  γ  - 14/10/13(月) 9:32 -

引用なし
パスワード
   >エラー処理と組み合わせてシート名を割り出す方法で可能は可能でしょうし、
は間違いです。
例えばこんな風です。

Function getSheetName(bookName As String) As String
  Dim sheet As String
  Dim target As String
  Dim s
  Dim k As Long

  For k = 1 To 99
    sheet = Format(k, "00") & "あいうえお"
    target = "'" & Path & "[" & bookName & "]" & sheet & "'!R1C1"
    s = ExecuteExcel4Macro(target)
    If TypeName(s) <> "Error" Then Exit For
  Next
  getSheetName = sheet
End Function
(Path などはモジュールレベルで定義済みとします。)

なお、上記を勧めているわけではなく、論理的な誤りを修正しただけです。
・ツリー全体表示

【76194】Re:シート名の先頭が変化するシートを特...
発言  γ  - 14/10/13(月) 6:02 -

引用なし
パスワード
   こんにちは。
ht tp://excel-ubara.com/excelvba5/EXCELVBA242.html
を参考にして下さい。
ExecuteExcel4Macroは特定の場合に限って使うべきで、
シート名が特定出来ない場合は、適当ではありません。

エラー処理と組み合わせてシート名を割り出す方法で可能は可能でしょうし、
シート名を直接取得する方法があるのかもしれませんが、
古い時代のマクロについては資料も乏しく、
そこに資源を投入して検討することは、殆ど時間の無駄と思われます。

普通に開いて、worksheetsコレクションを
Like で調べるのがよろしいかと思います。

しかも多数のセルを走査するのであれば、時間的にも
普通に開いてFindを使う方が、4,5倍は速くなるはずです。
先日の投稿の例で実験してみて下さい。
・ツリー全体表示

【76193】シート名の先頭が変化するシートを特定し...
質問  ペンネーム船長  - 14/10/12(日) 23:30 -

引用なし
パスワード
   【質問】
『test』フォルダーの中に複数のエクセルがあります。
それぞれのエクセルのシート名が『01あいうえお』だったり『05あいうえお』だったり『89あいうえお』だったりします。
下記のコードは、シート名が『01あいうえお』の場合だけ機能します。
これを、上記のシート名でも動くコードにしたいのです。
御教授お願いします。
なお、シート名『あいうえお』は不変で、必ずその頭に2桁の数字が来ます。
一桁の数字の表現は『1』ではなく、『01』となります

Private Sub CommandButton1_Click()
  Worksheets("調査結果").Range("B8:B1000").Value = "" 'クリア
  Dim buf As String, Target As String, i As Integer, n As Integer, nn As Integer
  Const Path = "C:\Users\○●\Desktop\test\"
  buf = Dir(Path & "*.xls")

  Do While buf <> ""
    For i = 1 To 1000
    n = 0
    nn = 0
    Target = "'" & Path & "[" & buf & "]01あいうえお!R" & i & "C7"
     If ExecuteExcel4Macro(Target) = "2-" Then
       nn = n + 1 'セルに『2-』があったときに1を加える
       Exit For
     End If
    Next i
     If nn = 0 Then '合計が0のとき、そのエクセルの名前を書き出す
        Worksheets("調査結果").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0) = buf
     End If
    buf = Dir()
  Loop
End Sub
・ツリー全体表示

【76192】Re:タブレット端末で実行できるようにし...
発言  γ  - 14/10/12(日) 11:42 -

引用なし
パスワード
   こんにちは。
コード内容をつぶさに拝見していませんが、
タブレット以外の通常のPCでは動作すると思います。
(Selectを多用している点や、インデントがつけられていないなどの
 改善点はありますが。)
タブレッドだからといって、特別なExcelコードがあるわけではないと思います。

むしろ、タブレットでは、(タブレットではないPCの)ダブルクリックなどに
相当する操作がきちんとできているのか、
そちらを確認することが大切ではないでしょうか。
・ツリー全体表示

【76191】Re:B列とC列と同じ値をA列→C列にして特...
お礼  マルク  - 14/10/12(日) 10:12 -

引用なし
パスワード
   独覚さんへ


教えていただいた関数で自分のやりたいことが出来ました!!
こういう多岐にわたる条件でも関数で処理出来ることに感銘です。
この関数を自動入力させてマクロで組んでみようと思います。
非常に助かりました。
ありがとうございます。


▼独覚 さん:
>あっ、今回の場合は式を
>=IF(D4<>"管理","",LOOKUP(1,0/((C$4:C$20000=C4)*(D$4:D$20000="親管理")),A$4:A$20000))
>でも。
・ツリー全体表示

【76190】Re:B列とC列と同じ値をA列→C列にして特...
発言  独覚  - 14/10/12(日) 7:58 -

引用なし
パスワード
   あっ、今回の場合は式を
=IF(D4<>"管理","",LOOKUP(1,0/((C$4:C$20000=C4)*(D$4:D$20000="親管理")),A$4:A$20000))
でも。
・ツリー全体表示

【76189】Re:B列とC列と同じ値をA列→C列にして特...
発言  独覚  - 14/10/12(日) 7:48 -

引用なし
パスワード
   ▼マルク さん:
関数と一般機能を使う案だけれども。

E4セルに
=IF(D4<>"管理","",INDEX(A$4:A$20000,MATCH(1,INDEX((C$4:C$20000=C4)*(D$4:D$20000="親管理"),0),0)))
と入力して下へフィルコピー。

E4セルを選択した状態でShiftキーとCtrlキーを押しながら下矢印キーを押し、セルが
選択された状態でコピー。
C4セルを選択して形式を選択して貼り付けで値の貼り付けでどうでしょう?

なお、上の式はデータの最大が20000行までの場合なのでもっと多い場合は式の中の
20000の部分をもっと大きくしてください。
・ツリー全体表示

【76188】B列とC列と同じ値をA列→C列にして特定す...
質問  マルク  - 14/10/12(日) 1:51 -

引用なし
パスワード
   1つのシートに羅列しているID番号のデータがあります            
B列とC列が関連として括られて表示されています。            
やりたいことはC列の親管理番号をA列のID番号に置き換えて
(C8をA8 C14をA14へ置き換えして)            
D列に管理と書いてあるセルの左横(場所でいうとC22.C23.C27.C28,C31.C32)            
に値を置き換えたいのですが、マクロで自動処理させることは可能でしょうか?            

最初、A列のデータをコピーしてC列に貼り付けた後、
一般と管理が含まれている横のセルを空白にするマクロを実行して
そうするとC列に置き換えた親ID番号だけが残るので,あとは、
手動で管理と書かれている横のセルに貼り付ける作業をしていましたが

データ量が1万以上ある時もあるので、
マクロで効率のいい変換の仕方を模索しています。
(関数も試しましたが上記の条件を満たす関数は見つかりませんでした)
            
まとめると            
C列の親ID番号の親管理をA列のID番号に置き換えて            
置き換え後、管理と書かれている左横のセルに乗せたい            
            
説明だけで伝わりにくいかもしれませんが            
お力添えをお願いします。

参考で、置き換え前と置き換えあとのエクセルの内容と
一般と管理と含まれてる横のセルを空白にするマクロを記述しおきます。            
            

           置き換え前
1                 
2     A列       B列       C列      D列
3    ID番号     予備のID番号  親ID番号 管理別項目
4    00111222    00999888    00999888   一般
5    00111223    00999888    00999888   一般
6    00111225    00999888    00999888   管理
7    00111226    00999888    00999888   管理
8    00111227    00999888    00999888   親管理
9    00111229    00777666    00777666   一般
10    00111230    00777666    00777666   一般
11    00111231    00777666    00999888   管理
12    00111232    00777666    00999888   管理
13    00111233    00777666    00999888   管理
14    00111234    00888777    00888777   親管理
15    00111235    00888777    00888777   管理
16    00111236    00888777    00888777   管理

          置き換え後
1                
2     A列         B列     C列     D列
3    ID番号     予備のID番号  親ID番号 管理別項目
4    00111222    00999888             一般
5    00111223    00999888             一般
6    00111225    00999888    00111227    管理
7    00111226    00999888    00111227    管理
8    00111227    00999888             親管理
9    00111229    00777666              一般
10    00111230    00777666              一般
11    00111231    00777666    00111227    管理
12    00111232    00777666    00111227    管理
13    00111233    00777666    00111227    管理
14    00111234    00888777             親管理
15    00111235    00888777    00111234    管理
16    00111236    00888777    00111234    管理


Sub 管理空白()
For Each Rng In Selection
If Rng.Value = "管理" Then
Rng.Offset(, -1) = ""
End If
Next
End Sub

Sub 一般空白()
For Each Rng In Selection
If Rng.Value = "一般" Then
Rng.Offset(, -1) = ""
End If
Next
End Sub
・ツリー全体表示

【76187】Re:webbrowserコントロール
発言  yama  - 14/10/10(金) 13:15 -

引用なし
パスワード
   アドバイス有難うございます。あれよこれよと試してますが、ますます深みに、はまってます(引き続き、調べてみます)。
>
>事象を確認していませんが、
>それが現実だとすると、
>ひとつの解釈として、
>ひとつのExcelアプリ-ケーションで、並列処理をユーザーに開放していない
>ということではないですか。
>別のExcelアプリケーションでWebbrowser処理を実行してみては?
・ツリー全体表示

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