Excel VBA質問箱 IV

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

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


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

【75865】スキャンPDFの表(画像)をエクセル表と...
質問  konkon  - 14/7/19(土) 15:53 -

引用なし
パスワード
   こんにちは。

スキャンで_PDF化された表が紙保存で数百枚あり、それを検索できるようエクセル化したいのですが、画像化されているためテキスト化する方法を探しています。

ソフトはAcrobat Readerしかないので、VBAでどうにかならないでしょうか?

過去、「PDFをExcelに戻す方法」でのkeinさんの回答が利用できないか?とやってみたのですが、「SendKeysでキーを送って〜」の部分がよく分かりませんでした。(T_T)

分からないままやってみたら、「このファイルが見つかりません」
「438 オブジェクトはこのプロパティまたはメソッドをサポートしていません」エラーが表示されました。

アドバイスなどよろしくお願いします。

現在の環境は win7 、Excel 2010、Adobe Reader XI ですが、
win7 Excel 2007、Acrobat Reader で同様の処理をすることになる予定です。
・ツリー全体表示

【75863】Re:Range object をFunctionに引渡す処理...
発言  マナ  - 14/7/19(土) 13:22 -

引用なし
パスワード
   >sht.Activate をしないとゆうことでしょうか

そうです。

>これではどのSheetがActiveになっているかどうか
>不明でうまくいきませんでした

どのSheetがActiveになっていても同じ動作するようにするためには
対象シートを明確に記述すればよいです。

例えば、↓の場合どのシートが対象になるかあいまいです。

>  Set Rng = Range("E4", Range("E65536").End(xlUp))

一方、↓これは、対象シートがshtであることが明確です。

>        sht.Cells(i, Retu).Select

この点を気をつけて全体を見なおせば、とりあえず期待の動きをすると思います。
(コードに無駄な部分が多いような気がしますが)
・ツリー全体表示

【75862】Re:Range object をFunctionに引渡す処理...
質問  Aoba  - 14/7/19(土) 12:36 -

引用なし
パスワード
   ▼マナ さん:
>とりあえず、activateしない、selectしないことを意識して
>書きなおしてみてはどうでしょうか

sht.Activate をしないとゆうことでしょうか
これではどのSheetがActiveになっているかどうか
不明でうまくいきませんでした
ご回答の意味がよくわかりません
よろしくお願いいたします
・ツリー全体表示

【75861】Re:Range object をFunctionに引渡す処理...
発言  マナ  - 14/7/19(土) 12:02 -

引用なし
パスワード
   とりあえず、activateしない、selectしないことを意識して
書きなおしてみてはどうでしょうか
・ツリー全体表示

【75860】Range object をFunctionに引渡す処理に...
質問  Aoba  - 14/7/19(土) 11:37 -

引用なし
パスワード
   Range object(変数 Rng) をFunctionに引渡す場合以下のようにしましたが
引渡されていません。原因がわかりません
宜しくお願いします

Sub Comb入力()
  Dim LastRow As Long
  Dim Retu As Integer
  Dim Rng As Range
 
  Set sht = Workbooks("Bookname.xls").Worksheets("Sheet1")
  Set Rng = Range("E4", Range("E65536").End(xlUp))
  sht.Activate
   Retu = 5
   LastRow = Cells(65536, Retu).End(xlUp).Row
   sht.Cells(LastRow + 1, Retu) ="2020
   Comb sht, Rng, Retu

End Sub

Function Comb(sht As Worksheet, Rng As Range, Retu As Integer)
   Dim jyufuku As Integer
   Dim i As Integer
   
   For i = Cells(65536, Retu).End(xlUp).Row To 4 Step -1
      jyufuku = WorksheetFunction.CountIf(Rng, Cells(i, Retu).Value)
      If jyufuku > 1 Then
        sht.Cells(i, Retu).Select
        Selection.Delete Shift:=xlUp
      End If
   Next i
End Function

Functionで
jyufuku = WorksheetFunction.CountIf(Rng, Cells(i, Retu).Value)
を以下のようにしますと上手く処理できます
jyufuku = WorksheetFunction.CountIf(Range("E4", Range("E65536").End(xlUp)), Cells(i, Retu).Value)
・ツリー全体表示

【75859】Re:差込メールでの添付ファイルの追加
発言  γ  - 14/7/19(土) 10:15 -

引用なし
パスワード
   個人意見であるとして、なにか信用されていないようなので、補足します。

mailto: の仕様を定めたRFCでは、添付ファイルは規定していません。
(「mailto: RFC」でネット検索してみてください)
ですから、添付ファイルはもともとmailto:で使えるものになっていないのです。

ただ、それをサービス的に実装することが禁止されているわけではないので、
ものによって実現されている可能性もあります。少ないと思いますが。
しかし、少なくとも、あなたのお使いのものはそれに対応していないようですね。
(「mailto: 添付ファイル」でネット検索してみてください。同様の議論があるでしょう)

ですから、mailtoを使わない別の方法を採用するのがよろしいでしょう。
・ツリー全体表示

【75858】Re:差込メールでの添付ファイルの追加
回答  γ  - 14/7/17(木) 20:33 -

引用なし
パスワード
   mailto:プロトコルを利用する方法では、添付ファイルをつけることはできません。

下記のいずれかがよろしいのでは?

1) Outlookのマクロを利用する

2)CDOを利用する方法
ht tp://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800_080.html

3)BASP21を利用する方法
上記2)の記事にリンクがあります。

特別のツールをインストールしないで済むのは 2)ですね。
・ツリー全体表示

【75857】差込メールでの添付ファイルの追加
質問  秋田猫  - 14/7/17(木) 19:24 -

引用なし
パスワード
   お世話になります。
差込メールにて
下記のような添付資料を追加したいのですが、
実行をしても表示されなくなりまして
どのように記述するべきでしょうか?
Outlookでは添付の方法がついていたのですが違うソフトのため
作業がとまってしまい書き込ませていただきました。
お手数ですが、何卒よろしくお願いします。
 ML.Attachments.Add "C:\scan\001.jpeg"

Option Explicit
Private Sub btnCreateMail_Click()
Dim str As String
Dim i As Long
Dim buf As String
Dim fn As String
Dim lnk As String
Dim wsMmbr As Worksheet
Dim wsPrf As Worksheet
Dim ML As Object

Set wsMmbr = Worksheets("テスト")
Set wsPrf = Worksheets("件名参加")

On Error GoTo myErr

fn = ThisWorkbook.Path & "\mail.txt"
buf = Space(FileLen(fn))
Open fn For Binary As #1
Get #1, , buf
Close #1


For i = 5 To wsMmbr.Range("B4").End(xlDown).Row
If wsMmbr.Cells(i, 8).Value = True Then

str = Replace(buf, "≪データ≫", wsMmbr.Cells(i, 7).Value)
str = Replace(str, "≪所属≫", wsMmbr.Cells(i, 3).Value)
str = Replace(str, "≪氏名≫", wsMmbr.Cells(i, 2).Value)
str = Replace(str, "≪ユーザーID≫", wsMmbr.Cells(i, 5).Value)
str = Replace(str, "≪パスワード≫", wsMmbr.Cells(i, 6).Value)
str = Replace(str, vbCrLf, "%0A%0D")


lnk = "mailto:" & wsMmbr.Cells(i, 4).Value & "?subject=" & wsPrf.Range("B1").Value & "&body=" & str

ThisWorkbook.FollowHyperlink lnk

End If

Next
Exit Sub

myErr:

End Sub
・ツリー全体表示

【75856】できました!ありがとうございます!
お礼  hamako  - 14/7/16(水) 9:11 -

引用なし
パスワード
   ▼独覚 さん:
ばっちりです!
なるほどですね!
ありがとうございました!!m(__)mm(__)m
・ツリー全体表示

【75855】Re:ありがとうございます!
発言  独覚  - 14/7/15(火) 15:46 -

引用なし
パスワード
   追記で。

上では列選択以外を省略していますがきちんと指定しておいたほうがいいかもしれません。
・ツリー全体表示

【75854】Re:ありがとうございます!
発言  独覚  - 14/7/15(火) 15:29 -

引用なし
パスワード
   ▼hamako さん:
>ただ、やはりC列以外も検索してしまうのですが
>C列以外は検索しないようにはどのようにしたらよいでしょうか・・m(__)m
>今は下記マクロを登録しています。

C列以外に検索値があった場合に「検索値に一致するデータが見つかりません」が表示されないのが
難点ですが。

あと、検索方向の列選択は下記を参考にしています
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=16359;id=excel

Sub 検索()
  Columns("C:C").Select
  ActiveSheet.ScrollArea = "C:C"
  Application.Dialogs(xlDialogFormulaFind).Show , , , 2
  ActiveSheet.ScrollArea = ""
End Sub
・ツリー全体表示

【75853】ありがとうございます!
質問  hamako  - 14/7/15(火) 14:11 -

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

早々のご返信ありがとうございます。
教えて頂いたページより、
ダイアログの初期値を「列」にすることができました!

ただ、やはりC列以外も検索してしまうのですが
C列以外は検索しないようにはどのようにしたらよいでしょうか・・m(__)m
今は下記マクロを登録しています。

Sub 検索()
ActiveSheet.Cells.Find _
 What:="", _
 LookIn:=xlValues, _
 SearchOrder:=xlByColumns, _
 MatchByte:=False
 Columns("C:C").Select
Application.Dialogs(xlDialogFormulaFind).Show
End Sub
・ツリー全体表示

【75852】Re:検索ダイアログを表示させるマクロボタンを...
発言  kanabun  - 14/7/15(火) 11:39 -

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

>Sub 検索()
>Columns("C:C").Select
> Application.Dialogs(xlDialogFormulaFind).Show
> End Sub
>
>上記のように設定してみたのですが、
>検索ダイアログの初期検索方向が「行」となっているため、
>毎回毎回タブで「列」に変えないといけないのをなんとかしたいです。
>(はじめから「列」になっている検索ダイアログを開きたい)
>また、「列」としたとしても

他の掲示板ですが、
ht tp://okwave.jp/qa/q674515.html
が参考になるかと。
・ツリー全体表示

【75851】検索ダイアログを表示させるマクロボタンを作...
質問  hamako  - 14/7/15(火) 11:03 -

引用なし
パスワード
   ★★★やりたいこと★★★
シートのC列に得意先名
(他の列には住所や電話番号や得意先コードが入ってます)
検索ダイアログを表示させるマクロボタンを作成し、
C列を検索したい
もしできれば、ヒットした得意先名のセルの色を赤くしたい(検索中に)
★★★★★★★★★★★★

Sub 検索()
Columns("C:C").Select
Application.Dialogs(xlDialogFormulaFind).Show
End Sub

上記のように設定してみたのですが、
検索ダイアログの初期検索方向が「行」となっているため、
毎回毎回タブで「列」に変えないといけないのをなんとかしたいです。
(はじめから「列」になっている検索ダイアログを開きたい)
また、「列」としたとしても
C列に検索ワードがないと他の列まで検索してしまうのも
できればなくしたいです
(・・エクセルの検索とはそういうものなのでしょうか?)

お手数おかけしますが、
よろしくお願いいたします。
・ツリー全体表示

【75850】Re:こんな集計できますか?
お礼  初心者(につまりました)  - 14/7/14(月) 10:22 -

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


ありがとうございました。
DICTIONARYではソートが心配でしたが
試してみます。
・ツリー全体表示

【75849】Re:パターン別に集計したいです。
発言    - 14/7/14(月) 7:26 -

引用なし
パスワード
   横から失礼します。

>当方、記憶マクロしか使ったことがなく、(中略)これを機にVBAについて勉強しようと思い

ご存じない方が誤解されるといけないので。
「マクロの記録」とVBAは、別物ではありません。

「マクロの記録」の初心者は、ともすれば記録したマクロをそのまま
使おうとされますが、そしてそれ以外の使い方があるとは思いもよらない
ようですが。

「マクロの記録」は、エクセル本人にサンプルコードを作らせるための
ものです。そして、作られたコードを見て、コードの書き方を理解する
ためのものです。あるいは、作られたコード(の一部)を、自分が書いて
いるコードの部品として使うためのネタ取り用です。

VBAを勉強すると言いながらマクロの記録を軽視するのは
宝の持ち腐れです。

弱点もありますけどw
上手に使えば大きな武器になります。


▼初心者 さん:
>▼kanabun さん:
>ご返信、ご回答本当にありがとうございました。
>当方、記憶マクロしか使ったことがなく、本集計も当初ピボットテーブルの記憶マクロで行おうと思っていたのですが、これを機にVBAについて勉強しようと思い、本照会をさせていただきました。
>いただいたご回答について、私の考えていた処理よりシンプルでとても参考になります。そもそものロジックの考え方から勉強しなおすべきだと痛感しました。
>ご指摘は真摯に受け止め、今後は基礎から勉強いたしたいと思います。ありがとうございます。
>最後になりますが、本質問にてご気分を害された方がいらっしゃいましたら申し訳ございませんでした。
・ツリー全体表示

【75848】Re:パターン別に集計したいです。
発言  γ  - 14/7/13(日) 23:25 -

引用なし
パスワード
   >Sub makePivotTable()
>  Dim myRange As Range
>  Dim pvCache
>  Dim pbTable
pbTable は すべて
pvTable に読み替えてください。タイプミスに気づかず。
・ツリー全体表示

【75847】Re:パターン別に集計したいです。
回答  γ  - 14/7/13(日) 23:07 -

引用なし
パスワード
   記憶マクロではなく、マクロ記録です。
これだって、十分使えるものになるはずですし、
VBAの立派な教材になります。
(下記のコードも、マクロ記録を修正したものです。)

Sheet1をSheet2のような形にいったん変換して、
Sheet2を ピボットテーブルにすれば
Sheet3のような表が得られます。

【Sheet1】
  A  B  C  D  E    F
1 分類 1. 2. 3. パターン 対象外
2 A  1      あ
3 A  1      あ
4 A    1    い
5 B    1  1  う
6 B    1        S
7 C      1

【Sheet2】
  A列   B列   C列
1 分類  種類  パターン
2 A    1    あ
3 A    1    あ
4 A    2    い
5 B    2    う
6 B    3    う
7 B    2    対象外
8 C    3    調査中

【Sheet3】
     列ラベル      
行ラベル 1   2  3
A              
 あ   2         
 い      1    
 う             
 対象外           
 調査中           
B              
 あ             
 い             
 う      1  1
 対象外    1    
 調査中           
C              
 あ             
 い             
 う             
 対象外           
 調査中       1

(コード参考例)

Option Explicit

Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim ws3 As Worksheet

Sub test()
  Dim category As String
  Dim goods As String
  Dim pattern As String
  Dim k As Long, j As Long
  Dim p As Long

  Set ws1 = Worksheets("Sheet1")
  Set ws2 = Worksheets("Sheet2")
  Set ws3 = Worksheets("Sheet3")
  p = 1

  '(1)Sheet2に別フォーマットで転記
  For k = 2 To ws1.Range("A1").End(xlDown).Row
    category = ws1.Cells(k, 1).Text
    pattern = getPattern(k)
    For j = 2 To 4
      If ws1.Cells(k, j).Value = 1 Then
        goods = getGoods(j)
        p = p + 1
        Call writeToSheet2(p, category, goods, pattern)
      End If
    Next
  Next

  '(2)それをもとにピボットテーブルをSheet3に作成
  makePivotTable

End Sub

Function getPattern(k As Long) As String
  If Len(ws1.Cells(k, 5).Value) > 0 Then
    getPattern = ws1.Cells(k, 5).Value
  ElseIf ws1.Cells(k, 6).Value = "S" Then
    getPattern = "対象外"
  Else
    getPattern = "調査中"
  End If
End Function

Function getGoods(j As Long) As String
  getGoods = CStr(j - 1)
End Function

Function writeToSheet2(p As Long, category As String, goods As String, pattern As String)
  ws2.Cells(p, 1).Value = category
  ws2.Cells(p, 2).Value = goods
  ws2.Cells(p, 3).Value = pattern
End Function

Sub makePivotTable()
  Dim myRange As Range
  Dim pvCache
  Dim pbTable
  
  Set myRange = ws2.Range("A1").CurrentRegion
  Set pvCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
    SourceData:=myRange.Address(external:=True), _
    Version:=xlPivotTableVersion14)
  Set pbTable = pvCache.CreatePivotTable _
      (TableDestination:=ws3.Range("A1"), _
      DefaultVersion:=xlPivotTableVersion14)
  With pbTable
    With .PivotFields("分類")
      .Orientation = xlRowField
      .Position = 1
    End With
    With .PivotFields("パターン")
      .Orientation = xlRowField
      .Position = 2
    End With
    With .PivotFields("種類")
      .Orientation = xlColumnField
      .Position = 1
    End With

    .AddDataField .PivotFields("種類"), "データの個数 / 種類", xlCount
    
    With .PivotFields("種類")
      .Orientation = xlColumnField
      .Position = 1
    End With

    .SortUsingCustomLists = False
    .PivotFields("分類").AutoSort xlAscending, "分類"
    .PivotFields("パターン").ShowAllItems = True
    
    .ColumnGrand = False
    .RowGrand = False
    .PivotFields("分類").Subtotals = Array( _
        False, False, False, False, False, False, False, False, False, False, False, False)
  End With
End Sub
・ツリー全体表示

【75846】Re:パターン別に集計したいです。
発言  γ  - 14/7/13(日) 20:31 -

引用なし
パスワード
   横から失礼します。

>今後は基礎から勉強いたしたいと思います。
と将来のことのように言わずに、

> まずはサンプルコードを読んで理解するところから始めたいと思いました。
とおっしゃったのですから、これを読まれて不明な点のひとつも
質問したらどうでしょう。
・ツリー全体表示

【75845】Re:パターン別に集計したいです。
お礼  初心者  - 14/7/13(日) 20:16 -

引用なし
パスワード
   ▼kanabun さん:
ご返信、ご回答本当にありがとうございました。
当方、記憶マクロしか使ったことがなく、本集計も当初ピボットテーブルの記憶マクロで行おうと思っていたのですが、これを機にVBAについて勉強しようと思い、本照会をさせていただきました。
いただいたご回答について、私の考えていた処理よりシンプルでとても参考になります。そもそものロジックの考え方から勉強しなおすべきだと痛感しました。
ご指摘は真摯に受け止め、今後は基礎から勉強いたしたいと思います。ありがとうございます。
最後になりますが、本質問にてご気分を害された方がいらっしゃいましたら申し訳ございませんでした。
・ツリー全体表示

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