ミスチルの大名曲の数々が配信決定!! 31日間無料!!【PR】

エクセルの、マクロとは何ですか?

A 回答 (3件)

エクセルの裏に貼り付けてあるVBと言うプログラムです。


ここにコードィングすれば、そのエクセルを開いて使う事が出来ます。
使う:プログラムを実行できる。

下は例です。
Sheet1のA列をSheet2のA列へ1個置きに転送する

Sub WK()
Dim CNT As Long
Dim END1 As Long
Dim Sh1 As Worksheet
Dim Sh2 As Worksheet

Set Sh1 = Worksheets("Sheet1")
Set Sh2 = Worksheets("Sheet2")
END1 = Sh1.Range("B65536").End(xlUp).Row

For CNT = 2 To END1 STEP 2
Sh2.Range("A" & CNT).Value = Sh1.Range("A" & CNT1).Value
Next CNT
E1:
Application.StatusBar = False
End Sub
    • good
    • 0

定義ということになると、厳密なところになりますが、マクロとVBAについて、マイクロソフトは、『Microsoft Office 97 プログラマーズガイド』という本の中で述べています。



「マクロ」というのは、その取り扱い言語は別として、ひとつの作業(タスク)の自動実行を目的とする機能のことです。逆にいうと、ひとつの作業を実行できないものは、マクロとは呼びません。例えば、引数を必要とする、プロシージャやユーザー定義関数は、マクロの範疇から外れます。

「VBA」(Visual Basic for Application)で書かれたものを総称して、プロシージャと呼び、マクロとは厳密には意味が異なります。また、Ver.4 の「マクロ関数(関数型)」で書かれたものも、プロシージャで自動実行で作業をするものも、総称してマクロと呼びます。また、ひとつのブックにあるモジュール(=プロシージャを呼び出すためのオブジェクト)群をプロジェクトと呼び、「モジュール」を組み合わせ一貫した仕事をするようにしたものを「システム」と呼んだりします。

なお、余談になりますが、一部、VBAでも、マクロ関数に依存しなければならない部分が存在しますが、Microsoft 側では、マクロ関数に関しては、過去のものとして、ヘルプ(英語)を残しているだけですが、新しく加えたものは載っておりません。未だ、マクロシート(ver.4)もダイアログシート(Ver.5)も、利用することは可能です。
    • good
    • 0

VBA(Visual Basic for Application)が今はマクロと呼ばれていますが


それが出来るまではマクロシートというのがあって
同様にプログラムしてEXCELを動かそうというものでした。
20年程前のことですが・・・・。

VBAではEXCELで自動的にしたいことがほとんど記述可能です。
スキルは必要ですが・・・。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QVBAでマクロを組んでいますが、エラーが起きてしまいます。

VBAでマクロを組もうとしています。
作ろうとしているのは、フォルダを指定すると、そのフォルダの中に入っているワークブック全てのシートから特定の名前のシートだけ、別のブックにコピーされるというものです。
(例 1というフォルダの中にあ、い、うの3つのワークブックが入っているとすると、その3つのワークシートからAという名前のシートのみコピーされて、えという名前のワークブックにまとめられる。)

プログラムに関して初心者のため手探りで組んでみたのですが、「オブジェクト変数が…」というエラーが出てしまいます。

どこに原因があるのか教えていただけませんか。
コピペしたため改行など変かもしれません。
すみません。



Sub Sample()
Dim sFile As String
Dim sWB As Workbook, dWB As Workbook
Dim dSheetCount As Long
Dim sSheetCount As Long
Dim n As Integer
Dim i As Long

Const SOURCE_DIR As String = "C:\Users\A
Const DEST_FILE As String = "C:\Users\B.xls"

Dim sWork As Worksheet
Dim dWork As Worksheet

Dim tmp As Variant



Application.ScreenUpdating = False


sFile = Dir(SOURCE_DIR & "*.xls")
'SOURCE_DIR=「A」ファイルでその中に入ってるブックの名前を sFile とする

'フォルダ内にブックがなければ閉じる
If sFile = "" Then Exit Sub

'コピー先のブックを作成。dWBという名前のブックを加える。
Set dWB = Workbooks.Add

'dWBのシート数を取得。コピー先のシート数を表すときはdSheetCountを使う。
'コピー元のシート数はsSheetCountを使う。

dSheetCount = dWB.Worksheets.Count
sSheetCount = sWB.Worksheets.Count

Do
'コピー元のブックを開く
Set sWB = Workbooks.Open(Filename:=SOURCE_DIR & sFile)


'コピー元のファイルに「りんご」という文字があるか確認する。
'もし文字があったらコピー先のブックにコピーする。

'コピー元のワークシート数の何番目なのか表記はnで表す。
'コピー元のワークシートのことをsWorkと表す。
'コピー先のワークシートのことをdWorkと表す。

Set sWork = sWB.Worksheets
Set dWork = dWB.Worksheets

For n = 1 To sWB.Worksheets.Count
If InStr("sWork(sSheetsCount).name", "りんご") <> 0 Then
sWork("りんご").Copy After:=dWB.Worksheets(dSheetCount)

'コピー先のシート名をコピー元のブックの名前に置き換える
'コピー先のシート数+1の数だけシートを確認して、
'「りんご」という文字があったものだけ置き換える。
For i = 1 To dSheetCount + 1
If InStr("dWork(i).name", "りんご") <> 0 Then

'置き換える名前はコピー元のブック名を_で区切った(1)にあたるものにする。
tmp = Split("sWb.Name", "_")
dWork(i).Name = tmp(1)
End If
Next
End If
Next



'コピー元ファイルを保存しないで閉じる。

'ワークブック"Book1.xls"を保存しないで閉じる
'Sub CloseWorkbook()
'Workbooks("Book1").Close SaveChanges:=False
'End Sub
sWB.Close SaveChanges:=False



'次のブックのファイル名を取得
sFile = Dir()
Loop While sFile <> ""

'コピー先ブック作成時にあったシートを削除
Application.DisplayAlerts = False
For i = dSheetCount To 1 Step -1
dWB.Worksheets(i).Delete
Next i
Application.DisplayAlerts = True

'コピー先ブックを保存して閉じる
dWB.SaveAs Filename:=DEST_FILE
dWB.Close

Application.ScreenUpdating = False
End Sub

VBAでマクロを組もうとしています。
作ろうとしているのは、フォルダを指定すると、そのフォルダの中に入っているワークブック全てのシートから特定の名前のシートだけ、別のブックにコピーされるというものです。
(例 1というフォルダの中にあ、い、うの3つのワークブックが入っているとすると、その3つのワークシートからAという名前のシートのみコピーされて、えという名前のワークブックにまとめられる。)

プログラムに関して初心者のため手探りで組んでみたのですが、「オブジェクト変数が…」という...続きを読む

Aベストアンサー

>>dWBについてもdSheetcountとしているので、ActiveWorkbookとおこうとしたのですが、「オブジェクトはこのプロパティ、またメソッドをサポートしていない」と出てしまいました。


dWBはアウトプットするワークブック名であり既に
Set dWB = Workbooks.Add
とやってるから追加記述は要りません。

Qエクセルの式がわかりません、教えてください。

fujillinさん解り易くしました。

報告書を作成する際、入力内容から、A(業務報酬)
とB(預り金)を選ばせようとしていますが、うまく表示されません。どこがいけないのでしょうか?

パターンは4つありますが、
もし、$AP$7="×" ×で(請求書が弊社宛ではなくて)
NOT('!$AL$7="")文字式が空欄じゃなかったら(下請会社名の記載が有ったら)
B =$V$18(預り金)

もし、$AP$7="×" ×で(請求書が弊社宛ではなくて)
NOT('!$AL$7="")文字式が空欄じゃなかったら(下請会社名の記載が無かったら)
この事例はあり得ませんので削除

もし、$AP$7="○" ○で(請求書が弊社宛)
('!$AL$7="")文字式が空欄だったら(下請会社名の記載が無かったら)
A =$V$19(業務報酬)金額的には100%
もし、$AP$7="○" ○で(請求書が弊社宛)
NOT('!$AL$7="")文字式が空欄じゃなかったら(下請会社名の記載が有ったら)
A =$V$19(業務報酬)金額的には50%

を選ばせようとしています。

疑問点の $AT$7=(支払金額)は上記の式に関係ないものとして削除しました。

以下の文書では、もし、$AP$7="×"(請求書が弊社宛ではなくて)で $AT$7=""(支払金額の記載が無かったら)A=$V$19(業務報酬)

もし、$AP$7="○"(請求書が弊社宛で)、,NOT($AL$7==""(下請会社名の記載が有ったら)、A=$V$19(業務報酬)
そうでなければ、B=$V$18(預り金)

=IF(AND($AP$7="×",$AT$7=””),$V$19,IF(OR($AP$7="○",NOT($AL$7="")),'$V$19,$V$18))

改善策1として
=IF($AP$7="×",$V$18,$V$19)を入れてみましたが、
もし請求書が弊社宛では無ければ、預り金、そうでなければ業務報酬

もし、$AP$7="○" ○で(請求書が弊社宛)
($AL$7="")文字式が空欄だったら(下請会社名の記載が無かったら)
A =$V$19(業務報酬)
がうまくいきません。


改善策2として
=IF(OR($AP$7="○",NOT($AL$7="")),$V$18,$V$19)で作成しましたが、間違っていました。
(請求書が弊社宛)または(下請会社名の記載が有ったら)、業務報酬、そうでなければ預り金


パターン例
請求書が弊社宛 請求書が弊社宛じゃない
下請会社有 業務報酬 預り金
下請会社無 業務報酬 -

fujillinさん解り易くしました。

報告書を作成する際、入力内容から、A(業務報酬)
とB(預り金)を選ばせようとしていますが、うまく表示されません。どこがいけないのでしょうか?

パターンは4つありますが、
もし、$AP$7="×" ×で(請求書が弊社宛ではなくて)
NOT('!$AL$7="")文字式が空欄じゃなかったら(下請会社名の記載が有ったら)
B =$V$18(預り金)

もし、$AP$7="×" ×で(請求書が弊社宛ではなくて)
NOT('!$AL$7="")文字式が空欄じゃなかったら(下請会社名の記載が無かった...続きを読む

Aベストアンサー

またしても添付画像が判別できないですけど。
細かく書いても表示される画像は縮小されてしまうので、
それでもわかるように工夫(画像をトリミング;必要な部分以外は切り捨てる)する必要があります。
その方法は質問に関係ないので省きます。

画像のものを憶測で簡略化したものを添付します。
これで式を考えてみます。

私が回答投稿して良い空気なのかわからないけど…

■APが「○」の場合
ALやAYの内容がどうであれ、結果は全て「業務報酬」になります。

これを、IF関数を使って表すと以下のようになります。

=IF(AP="○","業務報酬",【AP="×"の場合の処理】)   …【式1】

これで、条件①~④の場合の処理は完了。

■APが「×」の場合
結果が「業務報酬」と「預り金」のどちらかになります。
どの条件で結果が分岐するのか、見てみると・・・

AYに金額の記入があるか、無い(空欄)かで違います。

これを、IF関数を使って表すと以下のようになります。

=IF(AY<>"","業務報酬","預り金")   …【式2】

これで、条件⑤~⑧の場合の処理は完了。

■合体!

(式1)と(式2)を合体させると、条件①~⑧全てを処理できる式になります。
ではやってみましょう。

=IF(AP="○","業務報酬",【AP="×"の場合の処理】)
   ↓
=IF(AP="○","業務報酬",【式2】)
   ↓
=IF(AP="○","業務報酬",IF(AY<>"","業務報酬","預り金"))   …完成!

※もちろん、「AP」「AY」だけだとセルになっていないので、行番号も加えて下さい。


■疑問
あくまで、私が画像から読み取った条件で考えたのですが

AL(業者名の有無)については、結果表示させるにあたり、条件として不要だと思います。

条件④と条件①の違いは?(画像で判別不可)

条件④と条件⑧は無いパターンとのことでしたので、
データミスでも存在しえないないものと解釈しまして、
敢えてそのようなケースが合った場合のエラー処理などは含めていません。

---------------------
★別解
添付した表を前提条件としての別解を。

条件がいくつもあっても、結果が「預り金」となるパターンは条件⑦、ただ1つのみ。

そこだけをIFで判別します。

=IF(AND(AP="×",AY=""),"預り金","業務報酬")

こんなにシンプルになります。
※もちろん、「AP」「AY」だけだとセルになっていないので、行番号も加えて下さい。

またしても添付画像が判別できないですけど。
細かく書いても表示される画像は縮小されてしまうので、
それでもわかるように工夫(画像をトリミング;必要な部分以外は切り捨てる)する必要があります。
その方法は質問に関係ないので省きます。

画像のものを憶測で簡略化したものを添付します。
これで式を考えてみます。

私が回答投稿して良い空気なのかわからないけど…

■APが「○」の場合
ALやAYの内容がどうであれ、結果は全て「業務報酬」になります。

これを、IF関数を使って表すと以下のようになります...続きを読む

Qエクセルを開いて文字を打つ際、いきなりローマ字入力したい

素のエクセルを開いて文字を打つ際、いきなりローマ字で入力することはできるのでしょうか。

エクセルを開いた後に「半角/全角」を押せばいいとか、「入力規則の設定を変更すればいい」とかではなく、素のエクセルを開いた時に最初からローマ字入力する方法を知りたいのです。

入力規則で入力方法を変更したファイルを開くとローマ字から始めることはできるようですが、設定変更したファイル(例えば設定変更したファイルをデスクトップに保存したものを開くといったこと)ではなく素のエクセルを開いて任意のセルにローマ字入力する方法はないのでしょうか。

Aベストアンサー

こんばんは。

>エクセルを開いた時には「タスクバー」右端のアイコンは「A」になっています。
>これを「あ」の状態で開きたいのです。

最初に、#4についてのフォローアップをさせていただきます。ご質問者さんは、試してみないうちに、自分の推測で判断されたようです。インスタンスという用語はご存知でしょうか。

インスタンスとは、鯛焼きの型(モールド)があれば、同じ形の鯛焼きがいくつもできます。同じ形に出来上がった、食べられる方の鯛焼きのことを、インスタンスといい、鯛焼き型のほうを、クラスと呼びます。#4さんのXlStartに入れたテンプレートはその元の型を意味しています。

XlStart フォルダーに入れたものは、テンプレートとして、新しく生成させるブックのインスタンスを作り、IMEがコントロールされるのであって、その都度、設定されたファイルを開けるのではありません。新規のブックに適用されます。ただし、既存のブックには適用されないのではないかと思います。

それをより具体的にしたものが、VBAで可能です。しかし最近は、こうしたコードをお教えしても、興味を示さない人が多いようです。アドインにしてしまえば、その機能だけに着目しますので、そのコード自体は気にならないはずですが、コードをみると恐れをなしてしまうかもしれません。(アドインにするためには、もう少しコードを加えなくてはなりませんが)

#4さんと同じ発想には基づいていますが、それをVBAでインスタンスを取り付けるわけです。新規ブックでも、既存のブックでも、それ自体には影響はしませんし、一切いじる必要性がありません。

参考:
[XL95]日本語入力システムのオン/オフを制御する方法
https://support.microsoft.com/ja-jp/help/407890

これを、そのまま取り付けても、
>素のエクセルを開いて任意のセルにローマ字入力する方法はないのでしょうか。
ご希望のようにはならないのです。そこで、個人用マクロブックに、クラスのインスタンスを設けるという形になります。別に個々のファイルを書き換える必要はありません。
たかが、このためにこんな長いコードが必要かと思われるでしょうが、プログラムというものはこんなものだということです。たったひとつのボタンを押す行為を、自動で行うようにするためには、こういうことも必要なのです。

'//32bit 用です。
''標準モジュール
Public myClass As New Class1
 Public Declare Function ImmGetContext Lib "imm32.dll" (ByVal hWnd As Long) _
     As Long
 Public Declare Function ImmReleaseContext Lib "imm32.dll" _
     (ByVal hWnd As Long, ByVal himc As Long) As Long
 Public Declare Function ImmSetOpenStatus Lib "imm32.dll" _
     (ByVal himc As Long, ByVal b As Long) As Long
 Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal _
     lpClassName As String, ByVal lpWindowName As String) As Long

Sub Auto_Open()
 Set myClass.App = Excel.Application
End Sub

''Class1

Public WithEvents App As Application

Private Sub App_NewWorkbook(ByVal Wb As Workbook)
 ImeActivate
End Sub

Private Sub App_SheetActivate(ByVal Sh As Object)
ImeActivate
End Sub

Private Sub App_WindowActivate(ByVal Wb As Workbook, ByVal Wn As Window)
ImeActivate
End Sub

Private Sub App_WindowDeactivate(ByVal Wb As Workbook, ByVal Wn As Window)
 ImeActivate
End Sub

Private Sub App_WorkbookActivate(ByVal Wb As Workbook)
ImeActivate
End Sub

Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
  With ActiveSheet  '入力セルを認識させる
   On Error Resume Next
    ActiveCell.Activate
    ActiveCell.Select
   On Error GoTo 0
  End With
  ImeActivate
End Sub

'必要に応じてイベントマクロを増やします。

Function IMEControl(ByVal nMode As Long)
   Dim ClassName As String, WindowName As String
   Dim hWnd As Long, IMC As Long, ret As Long
   ClassName = "XLMAIN"
   'WindowName = Application.Caption '不要
   hWnd = FindWindow(ClassName, vbNullChar)
   IMC = ImmGetContext(hWnd)
   ret = ImmSetOpenStatus(IMC, nMode)
   ret = ImmReleaseContext(hWnd, IMC)
End Function
Sub ImeActivate()
If VBA.IMEStatus = vbIMEModeOff Then
   Call IMEControl(1)
End If
End Sub

こんばんは。

>エクセルを開いた時には「タスクバー」右端のアイコンは「A」になっています。
>これを「あ」の状態で開きたいのです。

最初に、#4についてのフォローアップをさせていただきます。ご質問者さんは、試してみないうちに、自分の推測で判断されたようです。インスタンスという用語はご存知でしょうか。

インスタンスとは、鯛焼きの型(モールド)があれば、同じ形の鯛焼きがいくつもできます。同じ形に出来上がった、食べられる方の鯛焼きのことを、インスタンスといい、鯛焼き型のほうを、クラス...続きを読む

QExcelで名前の7文字組みの方法を教えてください

Excelデータで名前をスペースで入れて7文字組みに変換させたいのですが、
関数またはVBAなどの方法を教えていただけませんでしょうか?
今は関数で個別でMID関数を使い分けてしています。

例) 
林一    → 林     一     田中一   → 田 中   一
林太郎   → 林   太 郎     田中太郎  → 田 中 太 郎
林孝太郎  → 林   孝太郎     田中孝太郎 → 田 中 孝太郎

佐々木一  → 佐々木   一
佐々木太郎 → 佐々木 太 郎
佐々木孝太郎→ 佐々木 孝太郎

Aベストアンサー

板汚しすみません。まだ半角スペース残ってた
=CHOOSE(LEN(A2),,LEFT(A2,1)&REPT(" ",5)&RIGHT(A2,1),
REPLACE(LEFT(A2,B2),2,0,REPT(" ",B2-1))&REPT(" ",3)&REPLACE(RIGHT(A2,3-B2),2,0,REPT(" ",2-B2)),
IF(MOD(B2,2),LEFT(A2,B2)&REPT(" ",3)&RIGHT(A2,4-B2),
REPLACE(LEFT(A2,2),2,0," ")&" "&REPLACE(RIGHT(A2,2),2,0," ")),
IF(OR(B2=1,B2=4),LEFT(A2,B2)&REPT(" ",2)&RIGHT(A2,5-B2),
REPLACE(LEFT(A2,B2),2,0,REPT(" ",3-B2))&" "&REPLACE(RIGHT(A2,5-B2),2,0,REPT(" ",B2-2))),
LEFT(A2,B2)&" "&RIGHT(A2,6-B2),A2)

Qround関数の結果、「2.000」と表示設定したA1セルの値を、A2セルに「A1&”人”」と入れた

round関数の結果、「2.000」と表示設定したA1セルの値を、A2セルに「A1&”人”」と入れた場合、「2人」となってしまいます。
A2セルを「2.000人」としたい場合は、どうしたらいいでしょうか?
よろしくお願いします。

Aベストアンサー

前提としてROUND関数の桁数を0と置いているなら下記の通りです.
=TEXT(A1,"#.000")&"人"

参考
https://dekiru.net/article/4509/

Qマクロで消去したいです

たびたび同じ質問をしてしまい申し訳ありません
以前教えてもらった
Sub Sample()

Dim c As Range, cbx As Object
Dim rw As Long
Dim t As Single, h As Single, w As Single
Dim y As Single, v As Boolean, f As Boolean

For rw = 6 To 15
Set c = Cells(rw, 1)
t = c.Top
h = t + c.Height
w = c.Width
f = False

' Form Control
For Each cbx In ActiveSheet.CheckBoxes
y = cbx.Top + cbx.Height / 2
If t < y And y < h And cbx.Left < w Then
f = True
If cbx.Value = xlOn Then v = True Else v = False
Exit For
End If
Next cbx

' ActiveX Control
If Not f Then
For Each cbx In ActiveSheet.OLEObjects
If TypeName(cbx.Object) = "CheckBox" Then
y = cbx.Top + cbx.Height / 2
If t < y And y < h And cbx.Left < w Then
f = True
v = cbx.Object.Value
Exit For
End If
End If
Next cbx
End If

If f And v Then
Cells(rw, 3).Resize(, 3).ClearContents
Cells(rw, 16).Resize(, 2).ClearContents
End If
Next rw

End Sub
でシート「操作画面」のC13:E13,P13:Q13 C15:E15,P15:Q15は消去することができました
それを応用して別シート「集計」のI7:I12 K7:K12も合わせて消去しようかと思ったのですが上手く
動作しませんでした

大変申し訳ないのですが、また、ご指導のほどよろしくお願いいたします

たびたび同じ質問をしてしまい申し訳ありません
以前教えてもらった
Sub Sample()

Dim c As Range, cbx As Object
Dim rw As Long
Dim t As Single, h As Single, w As Single
Dim y As Single, v As Boolean, f As Boolean

For rw = 6 To 15
Set c = Cells(rw, 1)
t = c.Top
h = t + c.Height
w = c.Width
f = False

' Form Control
For Each cbx In ActiveSheet.CheckBoxes
y = cbx.Top + cbx.Height / 2
If t < y And y < h And cbx.Left < w Then
f ...続きを読む

Aベストアンサー

前回回答者です。

最初に、前回の説明と重複になってしまいますが・・・
https://oshiete.goo.ne.jp/qa/9807697.html

説明にもありますように、通常はセルとチェックボックスの関係をきちんと取れるようにしておいてから、マクロを作成するものと思います。
その意味において、前回のNo1様、No3様の回答は関係性を確かなものにする方法を提示なさっています。

No2の回答は、それらの情報が与えられないので、しかたなく見た目から推測する方法で処理したものですので、正確性や効率性の点であまり良いものとは言えません。
また、チェックボックスも複数の種類が想定でき、どちらなのかが不明でしたので、両方を考慮しましたが、実際には(常識的に)どちらか一方だけの利用であると推測できますので、結果的に残り半分のコードは不要ということになります。
さらに、きちんと関係性が取れている場合は、位置関係から探す必要もなくなるので、コードも大幅に短くできるはずですが、不明な状況でしたので、ひとまず冗長なコードであっても提示しておけば、後は、質問者様がアレンジなさるであろうことを期待しての回答でした。


今回のご質問で、
・それを応用して~~
・〇〇も合わせて消去しようかと~
・上手く動作しませんでした
「応用する」、「うまく動作しない」という情報だけから推理しようとしても、あまりにも可能性が広がりすぎてしまって皆目見当がつきません。

多少なりともヒントになりそうな情報として記せそうなのは、前回の回答で「セルの内容を消去している」部分は
> Cells(rw, 3).Resize(, 3).ClearContents
> Cells(rw, 16).Resize(, 2).ClearContents
の2行である、ということぐらいでしょうか。
(この部分に関しては、前回のNo3様と、たまたま同様の記述になっています)
ANo3様のコードの方が、シートを明記する形式で対象を指定していますので、より明確な記述方法になっていると言えるかもしれません。

ちなみに
>別シート「集計」のI7:I12 K7:K12を消去する
という部分だけであれば、
 Worksheets("集計").Range("I7:I12,K7:K12").ClearContents
のような記述で実現できるはずと思います。

前回回答者です。

最初に、前回の説明と重複になってしまいますが・・・
https://oshiete.goo.ne.jp/qa/9807697.html

説明にもありますように、通常はセルとチェックボックスの関係をきちんと取れるようにしておいてから、マクロを作成するものと思います。
その意味において、前回のNo1様、No3様の回答は関係性を確かなものにする方法を提示なさっています。

No2の回答は、それらの情報が与えられないので、しかたなく見た目から推測する方法で処理したものですので、正確性や効率性の点であまり良いものとは...続きを読む

Q表と関数

壁にぶつかり、再び質問しに参りました。
複数の質問がありますが、一度に全部を質問して混乱するといけないので
分けて質問したいと思います。
まず最初の質問分だけお伺いさせて頂きます。


1.A1に年月をいれます。(書式設定で2017/5/1をyyyy"年"m"月"と設定)。(N1~Y1)も同じ。
2.B列~F列にそれぞれ番号、名前、フリガナ、日付、金額のデータを入力(重複あり)
3.B列~F列のデータから個人(番号を基準)ごとに合計額を集計

ここで、excel入門レベルの私は、

N2に

=IF(N$1=$A$1,SUMIF($B$2:$F$1000,$L2,$F$2:$F$1000),"")

入れて、コピードラッグして作りました。(個人ごとの合計額を集計)


そして、ここで機能を加えることにしました。
「入金が未納状態である」ことを表の中に表示させようと思いました。
添付画像の赤文字が「入金が未納状態である」を示しています。

契約者の中には、色んなケースがあります。
「月払」「年払」の方がおり、また契約を途中で打ち切る方がおられます。

機能を追加したことで、ここで一旦、要件を整理したいと思います。

上記の1~3の他に

4.契約終了あり
5.契約形態として「月払」「年払」あり(J列)
6.「年払」契約者の更新月(K列)
7.契約者の入金予定額(I列) -未納と判定されると、この額が未納額と同額となります。
              契約終了者は、「契約終了」と表示されています
8.「未納判定の要件」
  ・「月払契約者の未納判定」
  納付すべき月払契約者(契約終了を除く)が、月替わりの直後(毎月1日-判定日)に行われる。
  前月分を納めていない(表の中では、「空白」)者を「未納認定」
  
  ・「年払契約者の未納判定」
  納付すべき年払契約者(契約終了を除く)が、契約者「更新月」(K列)の月替わりの
  直後(毎日1日-判定日)に行われる。判定日において前月(更新月)分を
  納めていない(表の中では、「空白」)者を「未納判定」


それでは
添付画像で例題を説明したいと思います。

●2017年4月(A1)の表-「未納判定日前」

2017年4月(正確には30日)の時点です

0052 A様(月払)は、未納金を残して契約終了
0493 B様(月払)は、3月に未納、4月は4月30日になっても入金確認ナシ → 「空白」状態(Q3)
0538 C様(月払)は、契約開始から滞りなく納める
0730 D様(月払)は、4月は4月30日になっても入金確認ナシ → 「空白」状態(Q5)
2965 E様(年払)は、更新月の2月から未納が続いている
3821 F様(年払)は、更新月の1月に納めた




●2017年5月(A1)の表-「未納判定日」

月が変わり、2017年5月(正確には1日)の時点です。この日は「未納判定日」。

0052 A様(月払)は、未納金を残しての契約終了ですが、もはや契約終了してますので
「未納判定」から除外。

0493 B様(月払)は、2017年5月1日に3月に続き4月も入金確認は認められなかったので
2017年4月30日から2017年5月1日になった時点で
(P3)に赤文字の-2,500があるにもかかわらず、「空白」(Q3)から
赤文字の-2,500(Q3)と表示が変わる

0538 C様(月払)は、先月(4月)も納めているので問題ナシ

0730 D様(月払)は、2017年5月1日に前月(4月)分は未納状態(Q5 空白)なので
2017年4月30日から2017年5月1日になった時点で正式に「未納」と判定され、
「空白」(Q5)から赤文字の-3,000(Q5)と表示が変わる

2965 E様(年払)は、更新月の2月に納められず、3月に入って「未納」と判定される。
しかし、(年払)なので3月1日(未納判定日)以降のセルは「空白」でも
未納判定を行っていない。
「年払契約者の未納判定」は、毎年、「更新月」(K列)の月替わりの
直後(毎日1日認定日)に行われる

3821 F様(年払)は、更新月の1月に一括して納めたので、「更新月」以降のセルが
「空白」でも年払契約者なので未納判定を行っていない。



このように表中から「未納判定日」において、「未納」と判定した時、その相当する
セル(N~EC)に、(I列)の入金予定額を未納額(マイナス数値)として表示させる
関数式を教えてください。


★注意事項

・VBAは使用しません
・作業列を設けても構いません
・本来、B列~F列のデータは月別に別シートに記録されています。質問しやすいように
このようなかたちにしました。
・B列~F列のデータは最大1000件
・月間データ(N~Y)は、最大10年(N~EC)
・月間データは、その都度別シートに記録されています。(個人ごとの入金合計額)のみ。
・質問内容に循環参照のおそれがある場合には、その解決策も併せて提示してください


脱字・脱語・質問内容に不備がありましたらご容赦ください。
よろしくお願い致します。

壁にぶつかり、再び質問しに参りました。
複数の質問がありますが、一度に全部を質問して混乱するといけないので
分けて質問したいと思います。
まず最初の質問分だけお伺いさせて頂きます。


1.A1に年月をいれます。(書式設定で2017/5/1をyyyy"年"m"月"と設定)。(N1~Y1)も同じ。
2.B列~F列にそれぞれ番号、名前、フリガナ、日付、金額のデータを入力(重複あり)
3.B列~F列のデータから個人(番号を基準)ごとに合計額を集計

ここで、excel入門レベルの私は、

N2に

=IF(N$1=$A$1,SUMIF($B$2:$F$...続きを読む

Aベストアンサー

ふむふむ。
No1への返信で
>>年払で未納だった人が次の月に支払った場合は、更新月ではないですが入金があったので、その額を表示しますか?
>上記の理由により、この件も次回に質問させて頂きます。
とありましたので、とりあえず更新月以外は全て空白でよいものと判断してしまいました。
未納判定はしないけれど、入金があれば記載する。ということですね。

であれば条件の一部を変える必要があります。
>年払で更新月と一致していなければ、空白を表示します。
という部分が、
年払いで更新月と一致していない場合、入金額が0なら空白、それ以外はそのままの数字を表示する。
というわけですね。
式は次のようになります。

=IF(O2="契約終了","契約終了",IF(O2="","",IF($J2="年払",IF($K2=N$1,IF(P2<O2,IF(Q$1>$A$1,"",-O2),P2),IF(P2=0,"",P2)),IF(P2<O2,IF(Q$1>$A$1,"",-O2),P2))))

あと、O列の入力式に訂正があります。
空白の時にも0が表示される式になっておりましたので、N3,N5にも0が表示されてしまったものと思います。
O2=IF(INDIRECT(YEAR(N$1)&"年"&MONTH(N$1)&"月!I"&ROW())="","",INDIRECT(YEAR(N$1)&"年"&MONTH(N$1)&"月!I"&ROW()))
としてください。
各シートでのN列が空白であった場合は空白を、それ以外はそのまま表示する。となっています。
(そのまま表示するの場合でも空白は0と変換されるので)
P列の方は実際の入金が無いというだけなので0と表示されても問題はないはずです。

いかがでしょう?

ふむふむ。
No1への返信で
>>年払で未納だった人が次の月に支払った場合は、更新月ではないですが入金があったので、その額を表示しますか?
>上記の理由により、この件も次回に質問させて頂きます。
とありましたので、とりあえず更新月以外は全て空白でよいものと判断してしまいました。
未納判定はしないけれど、入金があれば記載する。ということですね。

であれば条件の一部を変える必要があります。
>年払で更新月と一致していなければ、空白を表示します。
という部分が、
年払いで更新月と一致していな...続きを読む

Q【Excelの不思議な日付処理の初期値の疑問】日付データの基準日が1900/01/00 0:00なの

【Excelの不思議な日付処理の初期値の疑問】日付データの基準日が1900/01/00 0:00なのは何故ですか?

1900/01/01 0:00が基準日だと思っていましたが、

=now()-now()

にすると1900年1月0日0秒という存在日付の0日が基準日になっていることが分かりました。

日付データの基準日が存在しない日にちなのに計算は正しく表示されます。

どういう仕組みで整合性が取れるのか教えてください。

Aベストアンサー

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13171705193
こっちに有効な回答が最初の最初に入っているのに何故マルチポストをするのやら……

QExcelの関数について、教えてください!

すみません。こんなことができるか分からないのですが、Excelでやりたいことがあります。
本当は全自動で計算できればいいのですが、多少、人間の手が介入しても構いません。プログラミングなどは分からないので、なるべくExcelでやりたいです。関数もそこまで詳しくないので、できたら分かりやすく教えていただけると嬉しいです。どうぞよろしくお願いします。

やりたいこと。
例えば、Aの行に、日時があり、Bの欄にデータがあります。下記参照ください。

A B
1月1日 100
1月2日 99
1月3日 101
1月4日 104
1月5日 94
1月6日 110
1月7日 112
1月8日 115
1月9日 109
1月10日 115
1月11日 120
1月12日 125

やりたいことが2段階になっています。

1、ある値を決めてその値が出た以降のデータを使いたいです(それ以前のデータは使わない)。例えば110という値を指定した場合、1月6日に110という値が出るので、1月6日以降だけのデータを使いたい。

2、その後、6日以降のデータで、データのバラツキを見たいので、例えば110の±10の範囲でその範囲を超えたときに、この表では、1月11日に120を超えるので、超えたポイントの日付を出して欲しいです。


例えばC1に110(110からチェックを開始)をD1にバラツキ範囲(±10)を入力したら、下記のような結果を出すことは難しいでしょうか??

A B C D
1月1日 100 110 10
1月2日 99
1月3日 101
1月4日 104
1月5日 94
1月6日 110
1月7日 112
1月8日 115
1月9日 109
1月10日 115
1月11日 120
1月12日 125

結果
チェックスタートした日付 1月6日
範囲超えた日付と方向 1月11日 (+)

かなり難しく、私では手作業での確認となっております。どうぞいい案がありましたら、教えてください。

すみません。こんなことができるか分からないのですが、Excelでやりたいことがあります。
本当は全自動で計算できればいいのですが、多少、人間の手が介入しても構いません。プログラミングなどは分からないので、なるべくExcelでやりたいです。関数もそこまで詳しくないので、できたら分かりやすく教えていただけると嬉しいです。どうぞよろしくお願いします。

やりたいこと。
例えば、Aの行に、日時があり、Bの欄にデータがあります。下記参照ください。

A B
1月1日 100
1...続きを読む

Aベストアンサー

こんにちは!

一例です。
↓の画像でG1セルに
=MIN(IF(B1:B1000>=C1,A1:A1000))
配列数式なのでCtrl+Shift+Enterで確定!

G2セルに
=MIN(IF((ABS(VLOOKUP(G1,A1:B1000,2,0)-B1:B1000)>=D1)*(A1:A1000>G1),A1:A1000))
これも配列数式なので、Ctrl+Shift+Enterで確定!

G3セルに
=IF(SIGN(VLOOKUP(G1,A:B,2,0)-VLOOKUP(G2,A:B,2,0))>0,"(-)","(+)")

G3セルだけは配列数式ではありません。
G1・G2セルの表示形式を「日付」にして完了です。

※ エラー処理をしていませんので、
データが存在しない場合は「1月0日」と表示されたり
エラーになるかもしれません。m(_ _)m

QVBAか関数でできるのでしょうか?

いつもこちらで皆さんに助けていただいてます。昨日質問しましたが画像が張り付けられていなかったので再度質問です。

”仕入表”タブに入力されたデータが横並びのデータです。
例えば、商品コード/品名/価格/色/入荷数 の並び順で、入力されています。一つの品番に対して色数は1から10個あり、色/入荷数/色/入荷数という風に構成されてます。

そこでこちらでお世話になり、仕入表に入力したデータを縦並びに色別で”在庫表”タブに表を作れるようなVBAを教えていただきました。

画像の仕入表は上の表で、下の表が在庫表に転記されたときの例です。
因みにその時のVBAはこちらです。


Sub Sample4() '//この行から
Dim i As Long, j As Long, cnt As Long, lastRow As Long, wS As Worksheet
Application.Calculation = xlCalculationManual
Set wS = Worksheets("仕入表")
With Worksheets("在庫表")
'//E列で「在庫表」Sheetの最終行取得★
lastRow = .Cells(Rows.Count, "E").End(xlUp).Row
'//「在庫表」SheetにデータがあればD列2行目~I列最終行データを一旦消去
If lastRow > 1 Then
.Range(.Cells(2, "D"), .Cells(lastRow, "I")).ClearContents
End If
cnt = 1
For i = 3 To wS.Cells(Rows.Count, "A").End(xlUp).Row '//「仕入表」Sheetの3行目~A列最終行まで
For j = 5 To wS.Cells(i, Columns.Count).End(xlToLeft).Column Step 2 '//E列~i行最終列まで2行毎★
If wS.Cells(i, j) <> 0 Then '//画像で「0」が表示されているので「0」以外を追加★
cnt = cnt + 1
'//最初のデータ行のみ「仕入表」Sheetの日付をD列に表示★
If j = 5 Then
.Cells(cnt, "D") = wS.Cells(i, "A")
End If
.Cells(cnt, "E") = wS.Cells(i, "B") '//B列に「コード」を表示
.Cells(cnt, "F") = wS.Cells(i, "C") '//F列に「商品名」を表示
.Cells(cnt, "G") = wS.Cells(i, "D") '//G列に「下代」を表示
.Cells(cnt, "H") = wS.Cells(i, j) '//H列に「色」を表示
.Cells(cnt, "I") = wS.Cells(i, j + 1) '//I列に「数」を表示
End If
Next j
Next i
'//最後にD列の表示形式(日付)を「在庫表」SheetのA3セルの書式に設定★
.Range("D1", Cells(Rows.Count, 4).End(xlUp)).NumberFormatLocal = wS.Range("A3").NumberFormatLocal
End With
Application.Calculation = xlCalculationAutomatic
End Sub '//この行まで


そこで、また新たにもしできるなら教えていただきたいことが出てきました。
仕入表タブのC列に出荷した商品が出たら「出荷済」と入力していますが(画像ではA列から埋まってますが実際はA~Cは空白にしてます)、”出荷済”にしたときに在庫表タブの同じ品番の商品すべて(日付~すべての色の個数まで)を黄色の色付けにすることはできますか?
もしできるとすごく楽になるのですが・・・
それではよろしくお願いします。

いつもこちらで皆さんに助けていただいてます。昨日質問しましたが画像が張り付けられていなかったので再度質問です。

”仕入表”タブに入力されたデータが横並びのデータです。
例えば、商品コード/品名/価格/色/入荷数 の並び順で、入力されています。一つの品番に対して色数は1から10個あり、色/入荷数/色/入荷数という風に構成されてます。

そこでこちらでお世話になり、仕入表に入力したデータを縦並びに色別で”在庫表”タブに表を作れるようなVBAを教えていただきました。

画像の仕入表は上の表で...続きを読む

Aベストアンサー

No6です。
以下の箇所を修正しました。前回のマクロをこれで入れ替えてください。
1)エラー13で型が一致しません。・・・この対策
色の箇所が0以外なら処理しているのを、空白以外なら処理するようにしました。
2)今更ですが黄色の色付けを日付の列だけにすることは可能でしょうか。
日付の列だけ黄色にしました。
-------------------------------------------------------
Sub Sample4() '//この行から
Dim i As Long, j As Long, cnt As Long, lastRow As Long, wS As Worksheet
Dim wns As Worksheet
Application.Calculation = xlCalculationManual
Set wS = Worksheets("仕入表")
Set wns = Worksheets("納品仕訳")
Worksheets("在庫表").Activate '追加
With Worksheets("在庫表")
'//E列で「在庫表」Sheetの最終行取得★
lastRow = .Cells(Rows.Count, "E").End(xlUp).Row
'//「在庫表」SheetにデータがあればD列2行目~I列最終行データを一旦消去
If lastRow > 1 Then
.Range(.Cells(2, "D"), .Cells(lastRow, "I")).ClearContents
.Range(.Cells(2, "D"), .Cells(lastRow, "I")).Interior.Pattern = xlNone
End If
cnt = 1
For i = 3 To wS.Cells(Rows.Count, "A").End(xlUp).Row '//「仕入表」Sheetの3行目~A列最終行まで
For j = 5 To wS.Cells(i, Columns.Count).End(xlToLeft).Column Step 2 '//E列~i行最終列まで2行毎★
If wS.Cells(i, j) <> "" Then '//画像で「0」が表示されているので「0」以外を追加★ '修正
cnt = cnt + 1
'//最初のデータ行のみ「仕入表」Sheetの日付をD列に表示★
If j = 5 Then
.Cells(cnt, "D") = wS.Cells(i, "A")
End If
.Cells(cnt, "E") = wS.Cells(i, "B") '//B列に「コード」を表示
.Cells(cnt, "F") = wS.Cells(i, "C") '//F列に「商品名」を表示
.Cells(cnt, "G") = wS.Cells(i, "D") '//G列に「下代」を表示
.Cells(cnt, "H") = wS.Cells(i, j) '//H列に「色」を表示
.Cells(cnt, "I") = wS.Cells(i, j + 1) '//I列に「数」を表示
If wns.Cells(i + 2, "C").Value = "出荷済" Then
.Range("D" & cnt).Interior.Color = 65535 '修正
End If
End If
Next j
Next i
'//最後にD列の表示形式(日付)を「在庫表」SheetのA3セルの書式に設定★
.Range("D1", Cells(Rows.Count, 4).End(xlUp)).NumberFormatLocal = wS.Range("A3").NumberFormatLocal
End With
Application.Calculation = xlCalculationAutomatic
End Sub '//この行まで
-------------------------------------

No6です。
以下の箇所を修正しました。前回のマクロをこれで入れ替えてください。
1)エラー13で型が一致しません。・・・この対策
色の箇所が0以外なら処理しているのを、空白以外なら処理するようにしました。
2)今更ですが黄色の色付けを日付の列だけにすることは可能でしょうか。
日付の列だけ黄色にしました。
-------------------------------------------------------
Sub Sample4() '//この行から
Dim i As Long, j As Long, cnt As Long, lastRow As Long, wS As Worksheet
Dim wns As Works...続きを読む


人気Q&Aランキング