Excel VBA質問箱 IV

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

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


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

【76368】Re:CSVデータ読み込み
発言  独覚  - 14/11/7(金) 13:50 -

引用なし
パスワード
   ▼Yuki さん:
>【76364】Re:CSVデータ読み込み あこ 14/11/6(木) 21:07 お礼
でこちらは閉じたということではないでしょうか?
向こうの質問も上記発言の後に書き込まれていますから。
・ツリー全体表示

【76367】Re:CSVデータ読み込み
発言  Yuki  - 14/11/7(金) 13:38 -

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

有難う御座います。

Multi Post だったのですね。
・ツリー全体表示

【76366】Re:CSVデータ読み込み
発言  独覚  - 14/11/7(金) 13:02 -

引用なし
パスワード
   ▼Yuki さん:
ht tp://excelfactory.net/excelboard/excelvba/excel.cgi?mode=all&namber=165858&rev=0
へ移動済みのようです。
・ツリー全体表示

【76365】Re:CSVデータ読み込み
発言  Yuki  - 14/11/7(金) 11:22 -

引用なし
パスワード
   ▼あこ さん:
>しかし,csvファイルによっては,
>「実行時エラー 
>アプリケーション定義またはオブジェクト定義のエラーです。」と出て,
>「デバック(D)」ボタンを押すと,下から4行目の
>「Cells(i, j) = strCell」のところが,黄色くエラーとして表示されてしまいます。

エラーになるファイルの行データを見せてください。
データを提示できない場合はデータを適当に置換えて

多分 ""のある部分がカンマの数によって違っているのでは
・ツリー全体表示

【76364】Re:CSVデータ読み込み
お礼  あこ  - 14/11/6(木) 21:07 -

引用なし
パスワード
   ありがとうございました。
参考になりました。
・ツリー全体表示

【76363】Re:CSVデータ読み込み
発言  γ  - 14/11/6(木) 20:54 -

引用なし
パスワード
   > 下記の記述もネット上で皆さんに教えていただきながらなんとかやっているもので
どこかの質問掲示板ですか?
同じところで継続して質問した方がいいんじゃないですか?

ここで継続するなら、
・入力CSVの特徴
・アウトプットをどのようにしたいか
を改めて、日本語で説明してください。

コードを読み解くのは手間ですし、
コード自体が間違っている可能性もありますから、
順序として、その説明が必要です。

あなたがよく理解していないということとは別に、
というか、それならなおさら、そうした説明をすることが
あなたにとっても有益なはずです。
・ツリー全体表示

【76362】CSVデータ読み込み
質問  あこ  - 14/11/6(木) 20:34 -

引用なし
パスワード
   質問です。

現在,以下のような記述をエクセル上のボタンに登録しています。
ボタンを押すと,デスクトップ上の任意のCSVファイルの選択を行い,CSVファイルを選択し,そのCSVデータを全てエクセル上のデータとして落としさせたいと思っています。

しかし,csvファイルによっては,
「実行時エラー 
アプリケーション定義またはオブジェクト定義のエラーです。」と出て,
「デバック(D)」ボタンを押すと,下から4行目の
「Cells(i, j) = strCell」のところが,黄色くエラーとして表示されてしまいます。

下記の記述もネット上で皆さんに教えていただきながらなんとかやっているもので,正直自分自身でよく理解できていませんが,上記のようなエラーを回避する方法をどなたかご教示いただけないかと思います。

どうかよろしくお願いいたします。


Sub Macro5()
Dim varFileName As Variant
Dim intFree As Integer
Dim strRec As String
Dim strSplit() As String
Dim i As Long, j As Long, k As Long
Dim lngQuate As Long
Dim strCell As String

varFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _
Title:="CSVファイルの選択")
If varFileName = False Then
Exit Sub
End If

intFree = FreeFile '空番号を取得
Open varFileName For Input As #intFree 'CSVファィルをオープン

i = 0
Do Until EOF(intFree)
Line Input #intFree, strRec '1行読み込み
i = i + 1
j = 0
lngQuate = 0
strCell = ""
For k = 1 To Len(strRec)
Select Case Mid(strRec, k, 1)
Case "," '「"」が偶数なら区切り、奇数ならただの文字
If lngQuate Mod 2 = 0 Then
Call PutCell(i, j, strCell, lngQuate)
Else
strCell = strCell & Mid(strRec, k, 1)
End If
Case """" '「"」のカウントをとる
lngQuate = lngQuate + 1
strCell = strCell & Mid(strRec, k, 1)
Case Else
strCell = strCell & Mid(strRec, k, 1)
End Select
Next
'最終列の処理
Call PutCell(i, j, strCell, lngQuate)
Loop
Close #intFree
End Sub

Sub PutCell(ByRef i As Long, ByRef j As Long, ByRef strCell As String, ByRef lngQuate As Long)
j = j + 1
'「""」を「"」で置換
strCell = Replace(strCell, """""", """")
'前後の「"」を削除
If Left(strCell, 1) = """" And Right(strCell, 1) = """" Then
strCell = Mid(strCell, 2, Len(strCell) - 2)
End If
Cells(i, j).value= strCell
strCell = ""
lngQuate = 0
End Sub
・ツリー全体表示

【76361】Re:webbrowserコントロール
回答  nanashi  - 14/11/6(木) 17:14 -

引用なし
パスワード
   とあるブログで解決方法を見つけたんだけども、ググっても再発見できない。
要は Application.ShowWindowsInTaskbar を一度 False にしてから再度 True にすればタスクバーアイコンが復活するということでした。
ただし、WebBrowserControl のある UserForm のコードに上記の処理を書いても無効。(タスクバーアイコンがおかしくなるのはコードの実行後だから。)


UserForm には

  For indx = 1 To Application.Workbooks.Count
    Workbooks(indx).Activate
  Next
  ThisWorkbook.Activate

とし、別にイベントクラスモジュールを作って

  Public WithEvents xlApp As Application
  Private Sub RecoverTaskBar()
    xlApp.ShowWindowsInTaskbar = False
    xlApp.ShowWindowsInTaskbar = True
  End Sub
  
  Private Sub xlApp_WorkbookActivate(ByVal Wb As Workbook)
    Call RecoverTaskBar
  End Sub

ThisWorkBookで

  Dim objEventHandler As EventClassModule
  Private Sub Workbook_Open()
    If CLng(Application.Version) <= 14 Then
      Set objEventHandler = New EventClassModule
      Set objEventHandler.xlApp = Excel.Application
    End If
  End Sub

とイベント有効にしてやればよいはず。
#バージョンチェックしている理由が思い出せない。
・ツリー全体表示

【76360】Re:オートフィルター後必要な行数だけ表示
お礼  亜矢  - 14/11/6(木) 13:35 -

引用なし
パスワード
   ▼kanabun さん:
>AutoFilterかけて 下から可視行の数を数えて, 25番目のセルに
>ジャンプしています。
>
>Sub test1()
> Dim i&, k&
>  With ActiveSheet
>   .AutoFilterMode = False
>   With .Range("A1").CurrentRegion
>     .AutoFilter 2, "B" '← 実際の条件に変更
>     With .Columns(1).Cells
>       For i = .Count To 2 Step -1
>         If .Item(i).EntireRow.Hidden = False Then
>           k = k + 1
>         End If
>         If k = 25 Then Exit For
>       Next
>       Application.Goto .Item(i), Scroll:=True
>     End With
>   End With
>  End With
>End Sub
>
>もっと簡単な方法がありそうですが。
ありがとうございました。解決しました。
・ツリー全体表示

【76359】Re:オートフィルター後必要な行数だけ表示
発言  kanabun  - 14/11/6(木) 12:50 -

引用なし
パスワード
   AutoFilterかけて 下から可視行の数を数えて, 25番目のセルに
ジャンプしています。

Sub test1()
 Dim i&, k&
  With ActiveSheet
   .AutoFilterMode = False
   With .Range("A1").CurrentRegion
     .AutoFilter 2, "B" '← 実際の条件に変更
     With .Columns(1).Cells
       For i = .Count To 2 Step -1
         If .Item(i).EntireRow.Hidden = False Then
           k = k + 1
         End If
         If k = 25 Then Exit For
       Next
       Application.Goto .Item(i), Scroll:=True
     End With
   End With
  End With
End Sub

もっと簡単な方法がありそうですが。
・ツリー全体表示

【76358】オートフィルター後必要な行数だけ表示
質問  亜矢  - 14/11/6(木) 10:39 -

引用なし
パスワード
   お世話になります。
 Range(*,*).select
 Application.GoTo Reference:=ActiveCell, Scroll:=True
 でアクティブセルを左上に表示していますが、オートフィルターした後
 行数がたくさんあるので、下からたとえば25行だけ見える様にするには
 どのように記述したら良いか教えてください。最新データが画面の中央付近から
 上の方に表示されているということです。よろしくお願いします。
・ツリー全体表示

【76357】Re:userform
発言  カリーニン  - 14/11/5(水) 13:44 -

引用なし
パスワード
   出来ないと思います。
ユーザーフォームを非表示の状態でユーザーフォームを操作することは可能です。

Load Userform1

でユーザーフォームをメモリ上に呼び出します。
・ツリー全体表示

【76356】userform
質問  QQQ  - 14/11/5(水) 12:53 -

引用なし
パスワード
   with me
 .width=10
end with

userformの横のサイズって一定以上小さくならないのですか?

無理やりできませんか?
・ツリー全体表示

【76355】Re:検索して置換
発言  γ  - 14/11/4(火) 22:06 -

引用なし
パスワード
   尤も、普通は
D1: =IFERROR(VLOOKUP(A1,$B$1:$C$3,2,FALSE),A1)
などとするほうが早いでしょうけど。
2003以前なら、IFとVLOOKUPを組み合わせます。
・ツリー全体表示

【76354】Re:検索して置換
お礼  T氏  - 14/11/4(火) 9:29 -

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

Findメソッド等使って考えていましたが
まったくうまくいかず困っていました。。。

TEST3を使っていきたいと思います!
もちろん、自分で意味をちゃんと理解したうえで使います。

ありがとうございます!

▼γ さん:
>コメントを待っていましたが、
>平日は時間がとれないので、準備しておいたものを示しておきます。
>参考にしてください。
>
>Sub test1() '例示されたケースだけに有効
>  Dim r As Range
>  Dim v As Variant
>
>  For Each r In Range("A1", Range("A1").End(xlDown))
>    v = r.Value
>    Select Case v
>    Case Cells(1, "B").Value
>      v = Cells(1, "C").Value
>    Case Cells(2, "B").Value
>      v = Cells(2, "C").Value
>    End Select
>    r.Offset(0, 3).Value = v
>  Next
>End Sub
>
>Sub test2() ' 一般的なケースに適用可能
>  Dim r As Range
>  Dim m As Variant
>
>  For Each r In Range("A1", Range("A1").End(xlDown))
>    m = Application.Match(r, Columns("B"))
>    If Not IsError(m) Then
>      r.Offset(0, 3).Value = Cells(m, "C").Value
>    Else
>      r.Offset(0, 3).Value = r.Value
>    End If
>  Next
>End Sub
>
>Sub test3() ' 一般的なケースに適用可能
>  Dim dic As Object
>  Dim r As Range
>
>  Set dic = CreateObject("Scripting.Dictionary")
>
>  For Each r In Range("B1", Range("B1").End(xlDown))
>    dic(r.Value) = r.Offset(0, 1).Value
>  Next
>
>  For Each r In Range("A1", Range("A1").End(xlDown))
>    If dic.exists(r.Value) Then
>      r.Offset(0, 3).Value = dic(r.Value)
>    Else
>      r.Offset(0, 3).Value = r.Value
>    End If
>  Next
>End Sub
・ツリー全体表示

【76353】Re:検索して置換
回答  γ  - 14/11/3(月) 22:34 -

引用なし
パスワード
   コメントを待っていましたが、
平日は時間がとれないので、準備しておいたものを示しておきます。
参考にしてください。

Sub test1() '例示されたケースだけに有効
  Dim r As Range
  Dim v As Variant

  For Each r In Range("A1", Range("A1").End(xlDown))
    v = r.Value
    Select Case v
    Case Cells(1, "B").Value
      v = Cells(1, "C").Value
    Case Cells(2, "B").Value
      v = Cells(2, "C").Value
    End Select
    r.Offset(0, 3).Value = v
  Next
End Sub

Sub test2() ' 一般的なケースに適用可能
  Dim r As Range
  Dim m As Variant

  For Each r In Range("A1", Range("A1").End(xlDown))
    m = Application.Match(r, Columns("B"))
    If Not IsError(m) Then
      r.Offset(0, 3).Value = Cells(m, "C").Value
    Else
      r.Offset(0, 3).Value = r.Value
    End If
  Next
End Sub

Sub test3() ' 一般的なケースに適用可能
  Dim dic As Object
  Dim r As Range

  Set dic = CreateObject("Scripting.Dictionary")

  For Each r In Range("B1", Range("B1").End(xlDown))
    dic(r.Value) = r.Offset(0, 1).Value
  Next

  For Each r In Range("A1", Range("A1").End(xlDown))
    If dic.exists(r.Value) Then
      r.Offset(0, 3).Value = dic(r.Value)
    Else
      r.Offset(0, 3).Value = r.Value
    End If
  Next
End Sub
・ツリー全体表示

【76352】Re:検索して置換
発言  γ  - 14/11/3(月) 7:08 -

引用なし
パスワード
   単純に置換してしまうと、前の置換結果が次の置換に影響してしまう、
ということですね。

A列の各セルごとに、
  それがB列にあるか判定し、
  あれば、対応するC列の値を  D列に書き込み
  なければ、A列の値をそのまま D列に書き込む
繰り返し

という処理をすればいいと思います。

B列にあるかどうかの判定は、
B列の数が説明のように少なければ、If文でそのまま書いてもよいし、
Select Case ステートメントを使っても良いでしょう。

数が多ければ、
Application.Matchを使い、
マッチしなければ、返ってくる値が IsErrorで真になることを使います。

(別法として、Dictionaryを使うことも可能でしょう。
 B列の値と対応するC列の値をこれに保持しておいて、
 dic.Exisits(A列の値)で値の有無を問い合わせることができ、
 対応する値を取得することも簡単にできます。)

これらをヒントに少しトライしてみて下さい。
・ツリー全体表示

【76351】検索して置換
質問  T氏  - 14/11/2(日) 23:40 -

引用なし
パスワード
   下のようなデータがあったとします。
A列B列C列
1 2 3
2 3 2
3
A列=元データ
B列=違う値
C列=正しい値
A列にあるデータに対し
違う値と正しい値が入力されています。
(2ではなく3、3ではなく2)
これをVBAを使うことで
D列なる正しいデータを出力させたいです。
<実行結果>
A列B列C列D列
1 2 3 1
2 3 2 3
3    2
お知恵をかしてください。
・ツリー全体表示

【76350】Re:「サブフォルダ内ファイルのプロパテ...
お礼  おさむ  - 14/11/1(土) 23:30 -

引用なし
パスワード
   こんばんは。
あれからずっと試行錯誤中、と申しますか暗中模索な状態で未だ解決しておりません。
ただ、あまりお手を煩わせてしまうのも申し訳ございませんし…
ご返信いただきました事、本当に感謝しています。

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

【76349】Re:「サブフォルダ内ファイルのプロパテ...
発言  カリーニン  - 14/11/1(土) 23:24 -

引用なし
パスワード
   >ただ今、参考web「パソコン便利ツール集」の管理人者様にアドバイスをいただき試行錯誤しているところですが、何分vbaの知識が0に等しい状態なので…

>そして、以下を参考に、上記URLのものに再帰処理を追加してみるようアドバイスいただいたものの、苦戦しております。

現在アドバイスに従い試行錯誤中でしたら私の出る幕は無いですね。
私のレスはこれまでとさせていただきます。
・ツリー全体表示

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