You could also achieve this by looping through all of the controls on the form. Some of the benefits to this approach would be that you can add more checkboxes without having to modify the code, it's significantly less characters of code than the other approaches, and there is no redundant code (e.g. repeated used of iif() with different parameters).
The main drawback to this approach would be if you wanted the values in a sorted order. They will be sorted in the order in which the CheckBoxes were created.
Another consideration is if you have other CheckBox controls on the form you don't want this to apply to. You could add an additional check to look for a prefix on the .Name property, or set something in .Tag property, or put the CheckBoxes inside of a frame and change Me.Controls to Frame1.Controls.
Dim Control As Control, Data As String
For Each Control In Me.Controls
If TypeName(Control) = "CheckBox" Then
If Control.Value Then ' This is on a different line to prevent errors, VB checks all conditions of an If even if first one is false.
Data = Iif(Data <> "",Data & ", ","") & Control.Caption
End If
End If
Next
Range("R4").Value = Data
Notice how I used an Iif() to update Data for your concern about separating the values with a comma.