Excel VBA質問箱 IV

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

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


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

【78628】Re:特定の文字列の入っている行を削除し...
発言  β  - 16/12/2(金) 11:06 -

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

まだ原因はわかりません。
もう1つ確認してください。

>一つ一つ手動で検索→削除すると1128行のデータが残るのですが
>VBAで実行すると1118行で10行分のデータが削除されてしまっているのです。

このシートで以下のコードを走らせてください。
で、でてくるメッセージが正しい件数かどうかを確認してみてください。
(全体の行数と削除行数を表示しています。ですから引き算すれば残る行数になります)

Sub 確認2()
  Dim a As Range
  Dim r As Range
  Dim c As Range
  Dim f As Range
  Dim x As Long
  
  '使用領域の K列から最終列までの列数
  x = Range("A1", ActiveSheet.UsedRange).Columns.Count - 10
  '判定対象領域
  Set a = Range("I4", Range("I" & Rows.Count).End(xlUp)).Offset(, 2).Resize(, x)
  
  Set c = a.Find(What:="NA", LookAt:=xlWhole)
  If c Is Nothing Then
    MsgBox "領域に NA はありません"
    Exit Sub
  End If
 
  Set f = c
 
  Do
    If r Is Nothing Then
      Set r = c
    Else
      Set r = Union(r, c)
    End If
    Set c = a.FindNext(c)
  Loop While c.Address <> f.Address
 
  MsgBox "対象領域の行数は " & a.Rows.Count & "行で、そのなかの削除対象は" & Intersect(r.EntireRow, Columns("K")).Count & "行です"
 
End Sub
・ツリー全体表示

【78627】Re:特定の文字列の入っている行を削除し...
質問  piropiro  - 16/12/1(木) 15:39 -

引用なし
パスワード
   ▼β さま〜〜〜

ありがとうございます。
なんと!お優しい!!!!
全然明日でも大丈夫です。
βさまのご都合の良いときで。

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

【78626】Re:特定の文字列の入っている行を削除し...
発言  β  - 16/12/1(木) 15:23 -

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

奇々怪々ですねぇ・・・

しばらくしたら外出しますので、明日以降になると思いますが
何か原因がないのか、さぐってみます。

最大列については、7000 と指定せず自動取得ができるのですが
それは、原因がわかってからにしましょう。
・ツリー全体表示

【78625】Re:特定の文字列の入っている行を削除し...
質問  piropiro  - 16/12/1(木) 15:15 -

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

わざわざ確認コードまで。。。
ありがとうございます!
でも、NAなかったです。。。。
う〜ん、煮詰まってきました。

NAがないのに削除された行のデータをみてみましたが
他の行と特に変わったところはなく。。。
今現在はINC列までデータが入っているのですが
日によって増えたりするので7000列に指定しているのですが
これは関係ないですよね?
・ツリー全体表示

【78624】Re:特定の文字列の入っている行を削除し...
発言  β  - 16/12/1(木) 15:01 -

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

う・・・ん・・・
どこかに(ずっと、右のほうに)NAがあると思うんですがねぇ。

以下のコードを走らせて出てくる列が、一番右側にNAがあった列です。

Sub 確認()
  Dim c As Range
  Dim f As Range
  Dim col As Long
  
  Set c = Columns("K:JIF").Find(What:="NA", LookAt:=xlWhole)
  If c Is Nothing Then
    MsgBox "領域に NA はありません"
    Exit Sub
  End If
  
  Set f = c
  
  Do
    If c.Column > col Then col = c.Column
    Set c = Columns("K:JIF").FindNext(c)
  Loop While c.Address <> f.Address
  
  MsgBox "一番右のNAは " & Split(Columns(col).Address(False, False), ":")(0) & " 列にあります"
  
End Sub
・ツリー全体表示

【78623】Re:特定の文字列の入っている行を削除し...
質問  piropiro  - 16/12/1(木) 13:46 -

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

こんな早く教えて頂けるなんて本当にありがとうございます。

最初はFindメソッドを使用してみたのですがうまくいかず。。。
お恥ずかしいですが、今の私の知識では先程のコードが精いっぱいでして。。。

MATCHを使うとこんなに処理がスムーズなんてすばらしいです。
まだ理解できていませんが、解読してみます!

それからもうひとつ質問なのですが
一つ一つ手動で検索→削除すると1128行のデータが残るのですが
VBAで実行すると1118行で10行分のデータが削除されてしまっているのです。
(NAは含まれていないのです)

先程の私のダメダメなコードでもβさんのMATCHのコードでもです。
βさんは「NAのない行は削除されないと思います」っと書いてくださいましたが
私のPCでは削除されてしまうのです。
お心当たりがありましたら教えてください。
よろしくお願いします。
・ツリー全体表示

【78622】Re:特定の文字列の入っている行を削除し...
発言  β  - 16/12/1(木) 13:09 -

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

シート関数MATCHを使った処理例です。
ご参考まで。

Sub Sample()
  Dim lastrow As Long
  Dim i As Long, j As Long
  Dim x As Variant
  
  lastrow = Cells(Rows.Count, 9).End(xlUp).Row

  For i = lastrow To 4 Step -1

    x = Application.Match("NA", Range(Cells(i, 11), Cells(i, 7000)), 0)
    If IsNumeric(x) Then Rows(i).Delete
      
  Next i
  
End Sub
・ツリー全体表示

【78621】Re:特定の文字列の入っている行を削除し...
発言  β  - 16/12/1(木) 13:02 -

引用なし
パスワード
   こちらで、そのまま実行しましたが、NAのない行は削除されないと思いますけど?
ただし、このコードには問題があります。

行 i に対して、4列目から7000列目までループでチェックし(この 7000 が意味のある数字なのかどうかは??ですけど)
どこかの列にNA があって行削除すれば、もう、その行の判定は不要ですよね。削除してしまってますから。
なのに、コードは延々と 削除の結果繰り上がった空白行に対して判定を繰り返しています。
結果は、NAではないのでカラブリで、結果オーライですけど無駄ですね。
削除したら Exit For で 当該のループを強制脱出させなければいけません。

ところで、列ごとに NAかどうかのチェックをしていますが、シート関数のMATCHをVBAで利用したり
VBFのFindメソッドで、当該行の当該列領域に NA があるかないかを1行で判定して、あれば、それを削除。
こういう方法がおすすめです。

それと、コードにはインデントを付けましょう。
・ツリー全体表示

【78620】特定の文字列の入っている行を削除したい...
質問  piropiro  - 16/12/1(木) 12:08 -

引用なし
パスワード
   VBA初心者です。
よろしくお願いします。

以下のように書いたのですが、結果がおかしいのです。

Dim lastrow As Long
Dim i As Long, j As Long

lastrow = Cells(Rows.Count, 9).End(xlUp).Row

For i = lastrow To 4 Step -1

For j = 11 To 7000

If Cells(i, j) = "NA" Then
Rows(i).Delete

End If

Next j
Next i

範囲内にNAと入力されたセルがあったら
その行を削除したいのですが
NAがない行も削除されているのです。

どなたかアドバイスをお願いいたします!
・ツリー全体表示

【78619】Re:特定の文字だけピックアップ
お礼  ふむふむ  - 16/11/30(水) 0:57 -

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

ありがとうございます!!!
できるのですね!
とても勉強になりました。

ほんとうにありがとうございます。
・ツリー全体表示

【78618】Re:特定の文字だけピックアップ
発言  β  - 16/11/29(火) 16:28 -

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

あぁ、姓だけではなく、後半の名も取得するのですね。

Sub Sample2()
  Dim s As String
  Dim w As Variant
  
  s = "田中 一郎" '間は全角スペース
  w = Split(Replace(WorksheetFunction.Trim(s), " ", " "))
  MsgBox w(0) & vbLf & w(1)
  
  s = "田中 一郎" '間は全角スペース
  w = Split(Replace(WorksheetFunction.Trim(s), " ", " "))
  MsgBox w(0) & vbLf & w(1)
  
  'でも半角スペースと決まっていれば以下でもOK
  
  w = Split(s)
  MsgBox w(0) & vbLf & w(1)
  
End Sub
・ツリー全体表示

【78617】Re:特定の文字だけピックアップ
発言  β  - 16/11/29(火) 16:22 -

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

間のスペースが全角なのか半角なのか
また、スペース1文字なのか2桁以上なのか不明ですが、
いずれであっても処理する参考コードです。

Sub Sample()
  Dim s As String
  
  s = "田中 一郎" '間は全角スペース
  
  MsgBox Split(Replace(WorksheetFunction.Trim(s), " ", " "))(0)
  
  s = "田中 一郎" '間は全角スペース
  
  MsgBox Split(Replace(WorksheetFunction.Trim(s), " ", " "))(0)
  
  'でも1桁の半角スペースと決まっていれば以下でもOK
  
  MsgBox Split(s)(0)
  
End Sub
・ツリー全体表示

【78616】特定の文字だけピックアップ
質問  ふむふむ  - 16/11/29(火) 15:39 -

引用なし
パスワード
   皆様

また、お知恵をお貸し下さい。

たとえば、氏名で「小林 太郎」とある場合、氏と名のブランクを境として、文字をピックアップして、あるセルにコピーして張り付けたいのですが、
可能でしょうか。

left/right/midでの方法は知っておりますが、必ず2文字とは限らないので、
文字と文字の空白を検地し、判断させたいのです。

「マイク スミス」のように、カタカナの場合もあります。
よい方法、または、可能かの有無が全く検討がつきません。

ご存知の方、どうかご教示頂けますとうれしいです。
宜しくお願いいたします。
・ツリー全体表示

【78615】Re:重複文を避けたい go to XXX
お礼  ふむふむ  - 16/11/29(火) 1:04 -

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

構成を変えればいいのですね。
ありがとうございます。
・ツリー全体表示

【78614】Re:重複文を避けたい go to XXX
発言  β  - 16/11/28(月) 18:55 -

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

GoTo はつかうな とまではいいませんが、できる限り(歯を食いしばって)
使わなくてもすむ記述をされるべきだと思います。
いろんな制御方法がありますが、簡単なのは

If なんとか Then
 なんとか の場合の 固有の処理のコード

 共通Proc

 なんとか の場合の 固有の処理のコード

Else
 なんとかじゃない場合の 固有の処理のコード

 共通Proc

 なんとかじゃない場合の 固有の処理のコード

End If

こんなコードにしておいて、このプロシジャとは別に

Private Sub 共通処理()

 両方の共通の処理コード

End Sub

こんな構成がいいのではないですか?
・ツリー全体表示

【78613】Re:フォームコントロールボタン内容抽出(Excel)
発言  β  - 16/11/28(月) 18:47 -

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

>ファイル数・シート数も多いので機械的に調べる方法があれば
>教えて頂けるでしょうか?

フォームツールのボタンのみですが。
ブックの最後にシートを追加して列挙します。
どのモジュールなのかの情報はいれていませんが。
(いれるには面倒なことをしなければいけないので)

Sub Test()
  Dim cb As Button
  Dim shF As Worksheet
  Dim shT As Worksheet
  Dim pos As Range
  
  Set shT = Worksheets.Add(After:=Worksheets(Worksheets.Count))
  shT.Range("A1:C1").Value = Array("シート名", "ボタン名", "マクロ名")
  Set pos = shT.Range("A2")
  
  For Each shF In Worksheets
    For Each cb In shF.Buttons
      pos.Resize(, 3).Value = Array(shF.Name, cb.Name, cb.OnAction)
      Set pos = pos.Offset(1)
    Next
  Next
  
End Sub
・ツリー全体表示

【78612】Re:フォームコントロールボタン内容抽出(Excel)
発言  β  - 16/11/28(月) 18:38 -

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

まず、プロジェクトエクスプローラで、シートを選択してエクスポートされるのは
固有のActiveX処理コードではなく、それが書かれているシートモジュール全体です。
Private Sub CommandButton1_Click も『たまたま』そこに書かれているだけです。

フォームコントロールに登録されたマクロは、当該ボタンを右クリックしてマクロの登録を選ぶと
小さなダイアログボックスの上に、そのマクロ名が表示されています。
その横の 編集ボタンをおせば、そのマクロが書かれているモジュールが表示され
そのマクロの場所にカーソルがあります。

多くは標準モジュールに書かれていると思いますが、プロジェクトエクスプローラで
そのモジュールを選択してエクスポートすると、シートモジュールと同じく
ファイルとして出力されます。
標準モジュールの場合は、拡張子が bas になりますが。
・ツリー全体表示

【78611】重複文を避けたい go to XXX
質問  ふむふむ  - 16/11/28(月) 18:08 -

引用なし
パスワード
   皆様
お力をお貸し下さい。
以下が作成したモジュールです。

If文で、ある条件に応じて使用するシートを選択させて、コピー&ペイストさせるという形で命令文を書いています。
If文の最初の命令文の中でのある部分の動作が、次の条件の場合でも同じ動作のものがあるので、この部分を重複して書かずにすむ方法がないかと思っています。
確か、該当の位置を指示して(最初の位置は、AAA:などで表示し、終わりが解りません)、”go to AAA ”のように出来なかったでしょうか。

他にいい方法がありましら、ご教示いただけるとうれしいです。
宜しくお願いします。
 
****************************************************
Sub TESTEDM()

Dim flag As Boolean
Dim Fdir As String
Dim FPss As String
Dim FileName As String
Dim Opnbook As Workbook
Dim Z As Worksheet
Dim H As Worksheet

Dim sh1, sh5, Sh6, Sh7 As Worksheet
Dim 入力者 As String
Dim コメント As String
Dim メルアド As String
Dim 結果 As Long
Dim 確認 As Long
Dim 入力 As Long
Dim n As Integer


'チラついて五月蝿いのを防止
Application.ScreenUpdating = False

Fdir = "U:\マクロ作成中\"
FPss = Fdir & "リスト(てすと).xlsx"
FileName = FPss
flag = False


For Each Opnbook In Workbooks
If Opnbook.FullName = FileName Then
flag = True
Exit For
End If
Next Opnbook

If flag = False Then
Set Opnbook = Workbooks.Open(FileName)
End If

Set Z = Opnbook.Worksheets("入社_派遣社員")
Set H = Workbooks("管理表.xlsm.xlsm").Worksheets("追加職員データ入力")

Workbooks("管理表.xlsm.xlsm").Activate
Worksheets("追加職員データ入力").Select
If Range("C3").Value = "派遣" Then

Opnbook.Activate


  Sheets("入社_派遣社員").Select
  Range("A1").End(xlDown).Select
  MsgBox "最終行は" & Range("A9").End(xlDown).Row & "です。"
  結果 = MsgBox("入力行は" & Range("A9").End(xlDown).Row + 1 & "です。続けますか?", vbYesNo)
  If 結果 = vbYes Then
    n = Cells(Rows.Count, "A").End(xlUp).Row + 1
    Range("A" & n).Select
    ActiveWorkbook.Activate
    Sheets("入社_派遣社員").Select
AAA:
    Range("A" & n).Value = "ABC"
    入力者 = InputBox("Inpurt YOUR Name", "入力者", "")
    Range("B" & n).Value = 入力者
    Range("C" & n).Value = "不要"
    Range("I" & n).Value = H.Range("C4").Value
    Range("J" & n).Value = "22" & H.Range("C5").Value
    Range("K" & n).Value = H.Range("C6").Value
    Range("L" & n).Value = H.Range("C7").Value
    Range("M" & n).Value = H.Range("C8").Value
    Range("N" & n).Value = H.Range("C9").Value
    Range("O" & n).Value = H.Range("C10").Value
    Range("P" & n).Value = H.Range("C11").Value
    Range("Q" & n).Value = "日本"

    Userform1.Show   
'AAA、はここまでとしたい

    Range("U" & n).Value = H.Range("C14").Value
    Range("W" & n).Value = "JP02 NSC"
    Range("X" & n).Value = "E-External"
    Range("Y" & n).Value = "EC-Temp. (salaried)"
    Range("Z" & n).Value = H.Range("C15").Value
    コメント = InputBox("コメントがあれば、入力して下さい。", "コメント", "")
    Range("AA" & n).Value = コメント
  
   
    確認 = MsgBox("入力終了です。入力内容を確認しますか?", vbYesNo)
      If 確認 = vbYes Then
        Sheets("入社_派遣社員").Select
      Else
    
    '保存するか否かのダイアログ表示させたい。
        'Application.DisplayAlerts = False ←これは、表示なしVersion
    
        'Opnbook.Close
   
      Workbooks("管理表_.xlsm.xlsm").Activate
      H.Range("C3").Select
    
      MsgBox "次は、XXを作成して下さい。"
      End If
  Else
    MsgBox "必要項目に手入力して下さい。"
    n = Cells(Rows.Count, "A").End(xlUp).Row + 1
    Range("A" & n).Select
    

  End If

ElseIf Range("C3").Value = "インターンシップ" Then
  
  Opnbook.Activate
  Sheets("入社_インターン").Select
  Range("A1").End(xlDown).Select
  MsgBox "最終行は" & Range("A9").End(xlDown).Row & "です。"
  結果 = MsgBox("入力行は" & Range("A9").End(xlDown).Row + 1 & "です。続けますか?", vbYesNo)
  If 結果 = vbYes Then
    n = Cells(Rows.Count, "A").End(xlUp).Row + 1
    Range("A" & n).Select

    'Workbook ("管理表.xlsm")
    ActiveWorkbook.Activate
    Sheets("入社_インターン").Select
    
   ? GoTo AAA ?

 ’この後がわからない。。。  

End If

End Sub
・ツリー全体表示

【78610】フォームコントロールボタン内容抽出(Excel)
質問  でじ  - 16/11/28(月) 18:05 -

引用なし
パスワード
   Activexコントロールのボタンであれば、プロジェクトエクスプローラで
ボタンが配置されているシート選択し、右クリックの「ファイルのエクスポート」
により出力されるclsファイルに以下の様に書かれます。
Private Sub CommandButton1_Click()
Call macro名
End Sub

しかしフォームコントロールボタンの「マクロの登録」で設定された内容は
clsファイルにに出力されません。
会社で作成された数あるEXCELツールファイルのボタンに
何が設定されているのか把握したいのですが、
Activexボタンとフォームコントロールボタンが混在しています
ファイル数・シート数も多いので機械的に調べる方法があれば
教えて頂けるでしょうか?
・ツリー全体表示

【78609】Re:VLOOKUPを使いたい
お礼  もよもと  - 16/11/28(月) 15:29 -

引用なし
パスワード
   βさん:
ご丁寧にありがとうございます。
早速、トライしてみます。
・ツリー全体表示

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